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

Google chrome extension 如何在浏览器上检测扩展?,google-chrome-extension,firefox-addon,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 +

我试图检测用户浏览器上是否安装了扩展

我试过这个:

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\u可访问\u资源清单键中 以便由扩展之外的页面加载

得到铬-extension://invalid net::ERR_失败

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

得到铬-extension://addon_id_youre_after/manifest.json net::ERR_失败

以下是我收到的错误图像:

我试图抓住错误

到目前为止我还没能抓住错误

任何帮助都将不胜感激

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

例如:-

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

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

GET
错误来自网络堆栈。Chrome在这两种情况下都会拒绝加载,并模拟网络错误-可以,但不能在
窗口中。引用我的话:

当资源(如
)加载失败时,使用接口
事件的错误事件将在元素上触发,从而启动加载,并调用元素上的
onerror()
处理程序这些错误事件不会出现在窗口中,但(至少在Firefox中)可以通过单个捕获
窗口来处理。addEventListener

下面的示例至少可以检测到网络错误。请注意,同样,您无法捕捉它们,因为这样可以防止它显示在控制台中。当GoogleCast扩展(公开一个资源)使用它作为一种检测方法时,这是一个很好的例子

s.onload = function(){alert("installed")}; 
s.error = function(){alert("I still don't know")};
请注意,您无法区分这两者。在内部,Chrome将其中一个请求重定向到
Chrome-extension://invalid
,但这种重定向对您的代码是透明的:无论是加载资源(像您一样)还是使用XHR。即使是新的fetchapi,它应该能够提供对重定向的更多控制,也无能为力,因为它不是HTTP重定向。它得到的只是一个无信息的网络错误

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


请理解,这是有意的。您引用的方法用于工作-您可以获取任何已知名称的资源。但这是指纹浏览器的一种方法——谷歌明确称之为“恶意”,并希望阻止这种行为

因此,Chrome18(早在2012年8月)引入了
web\u可访问的\u资源
model,以屏蔽需要暴露的嗅探功能的扩展。引用我的话:

在清单版本2之前,可以从web上的任何页面访问扩展中的所有资源这允许恶意网站对用户安装的扩展进行指纹识别或利用已安装扩展中的漏洞(例如XSS漏洞)。将可用性限制为仅可通过web访问的资源,既可以最小化可用的攻击面,又可以保护用户的隐私

随着谷歌积极对抗指纹识别,只有合作的扩展才能被可靠地检测到可能存在特定于扩展的黑客行为-例如特定的DOM更改、请求拦截或您可以获取的公开资源-但没有通用方法,扩展可能随时更改其“可见签名”。我在这个问题中解释了这一点:,但我希望您能更好地理解原因


总而言之,如果你真的想找到一种通用的方法,将任意扩展暴露在指纹中,这将被认为是恶意的,并且是Chrome中的一个隐私漏洞。

你可以使用Chrome.management.getAll()来获取已安装扩展的列表,其中包含的信息比它们的id还要多。我认为这是扩展开发人员的解决方案。啊,这是一个有趣的想法。我看到使用XMLHttpRequest的现有答案,并检查响应是否有错误。@wOxxOm,这就是我试图做的,但由于某种原因,我无法捕获错误。请看更新后的问题,我添加了一个图像。@wOxxOm我认为它不起作用,因为chrome extension:不起作用,它就像来自浏览器的内部请求。请参阅我对原始问题的评论。这种方法已经不起作用了,我链接了一个问题,解释了所有的可能性。@Xan你在我的原始问题(不同)中提到的所有问题的答案基本上都是否定的,这是不可能的。所以,为什么不把这个问题保持开放,让其他不是你的人提出解决方案,也许可以试着帮我抓住我添加的小提琴中出现的例外。谢谢你的时间。
s.onload = function(){alert("installed")}; 
s.error = function(){alert("I still don't know")};