如何在浏览器上检测扩展?

时间:2016-11-01 08:42:06

标签: google-chrome-extension firefox-addon

我正在尝试检测用户浏览器上是否安装了扩展程序。

我试过了:

var detect = function(base, if_installed, if_not_installed) {
    var s = document.createElement('script');
    s.onerror = if_not_installed;
    s.onload = if_installed;
    document.body.appendChild(s);
    s.src = base + '/manifest.json';
}
detect('chrome-extension://' + addon_id_youre_after, function() {alert('boom!');});

如果浏览器安装了扩展程序,我将收到如下错误:

  

必须在web_accessible_resources清单键中列出资源   为了通过扩展名以外的页面加载

     

GET chrome-extension://无效net :: ERR_FAILED

如果没有,我会得到一个不同的错误。

  

GET chrome-extension://addon_id_youre_after/manifest.json net :: ERR_FAILED

以下是我收到的错误的图片: The errors I am getting from the fiddle

我试图捕捉错误(fiddle)

try {
  var s = document.createElement('script');
    //s.onerror = window.setTimeout(function() {throw new Error()}, 0);
    s.onload = function(){alert("installed")}; 
    document.body.appendChild(s);
    s.src = 'chrome-extension://gcbommkclmclpchllfjekcdonpmejbdp/manifest.json';
} catch (e) {
  debugger;
  alert(e);
}

window.onerror = function (errorMsg, url, lineNumber, column, errorObj) {
    alert('Error: ' + errorMsg + ' Script: ' + url + ' Line: ' + lineNumber
    + ' Column: ' + column + ' StackTrace: ' +  errorObj);
}

到目前为止,我无法发现错误。
任何帮助将不胜感激

2 个答案:

答案 0 :(得分:2)

第一个错误是来自Chrome的信息,直接注入控制台而不能被您捕获(正如您所注意到的)。

GET错误来自网络堆栈。 Chrome会在任何一种情况下拒绝加载并模拟网络错误 - 您可以catch with onerror handler on the element itself,但window.onerror犯罪者不能。引用,强调我的:

  

当资源(例如<img><script>)无法加载时,会在启动加载的元素上触发使用接口Event的错误事件,并且{调用元素上的{1}}处理程序。 这些错误事件不会冒泡到窗口,但(至少在Firefox中)可以通过一次捕获onerror()来处理。

这是一个至少会检测到网络错误的示例。请注意,同样,您无法捕捉它们,因为它们无法在控制台中显示。当Google Cast扩展程序(即公开资源)将其用作检测方法时,它是source of an embarrasing problem

window.addEventListener

请注意,您无法区分这两者。在内部,Chrome会将其中一个请求重定向到s.onload = function(){alert("installed")}; s.error = function(){alert("I still don't know")}; ,但此类重定向对您的代码是透明的:无论是加载资源(如您所做)还是使用XHR。即使是新的Fetch API,它应该能够更好地控制重定向,但由于它不是HTTP重定向,因此无法提供帮助。它得到的只是一个无法提供信息的网络错误。

因此,您无法检测是否未安装或安装扩展程序,但不会公开资源。

请理解这是故意的。您提到的用于工作的方法 - 您可以获取名称已知的任何资源。但它是一种指纹浏览器的方法 - 谷歌明确称之为“恶意”和“#34;并希望防止。

因此,{18}引入了chrome-extension://invalid模型(一直追溯到2012年8月),以防止扩展嗅探 - 需要explicitly declare resources暴露。引用,强调我的:

  

在清单版本2之前,可以从Web上的任何页面访问扩展中的所有资源。 这允许恶意网站指定用户已安装的扩展程序或利用已安装扩展程序中的漏洞(例如XSS错误)。仅限于可明确用于Web访问的资源的可用性,既可以最大限度地减少可用的攻击面,又可以保护用户的隐私

Google积极打击指纹识别,只能合理地检测合作扩展程序。 可能存在特定于扩展程序的黑客攻击 - 例如特定的DOM更改,请求拦截或您可以获取的公开资源 - 但是没有通用方法,并且扩展可能会更改其可见的签名&#34;在任何时候。我在这个问题中解释过:Javascript check if user has a third party chrome extension installed,但我希望你能看到更好的原因。

总而言之,如果您确实要找到一种暴露任意扩展指纹识别的通用方法,那么这将被视为恶意攻击并且是Chrome中的隐私错误。

答案 1 :(得分:-1)

让您的Chrome扩展程序在页面上查找特定的DIV或其他元素,并使用非常具体的ID。

例如: -

<div id="ExtensionCheck_JamesEggersAwesomeExtension"></div>