如何检测浏览器上的扩展程序?
Posted
技术标签:
【中文标题】如何检测浏览器上的扩展程序?【英文标题】:How to detect extension on a browser? 【发布时间】:2017-03-14 09:17:27 【问题描述】:我正在尝试检测用户浏览器上是否安装了扩展程序。
我试过了:
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://invalid net::ERR_FAILED
如果没有,我会得到一个不同的错误。
GET chrome-extension://addon_id_youre_after/manifest.json net::ERR_FAILED
这是我遇到的错误的图像:
我试图捕捉错误(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);
到目前为止,我无法发现错误.. 任何帮助将不胜感激
【问题讨论】:
啊,这是一个有趣的想法。我看到使用 XMLHttpRequest 的现有答案并检查错误响应。 @wOxxOm ,这就是我想要做的,但由于某种原因我无法捕捉到错误。看更新的问题,我加了一张图片。 @wOxxOm 我认为它不会起作用,因为 chrome-extension: 不起作用,它就像来自浏览器的内部请求。 查看我对您原始问题的评论。此方法不再有效,我链接了一个解释所有可能性的问题。 @Xan 你在我原来的问题中提到的问题的所有答案(这是不同的)基本上都是说不,这是不可能的。那么为什么不让这个问题保持开放,让其他不是你的人提出解决方案,也许试着帮助我抓住我添加的小提琴产生的异常。 【参考方案1】:第一个错误是来自 Chrome 的信息,直接注入控制台,您无法捕获(正如您所注意到的)。
GET
错误来自网络堆栈。 Chrome 在任何一种情况下都拒绝加载并模拟网络错误 - 您可以 catch with onerror
handler on the element itself,但不能在 window.onerror
处理程序中。引用,强调我的:
当资源(例如
<img>
或<script>
)加载失败时,会在元素上触发使用接口Event
的错误事件,该元素启动加载,并且元素上的onerror()
处理程序被调用。 这些错误事件不会冒泡到窗口,但(至少在 Firefox 中)可以通过一次捕获window.addEventListener
来处理。
这是一个至少可以检测网络错误的示例。请注意,您不能捕捉它们,因为它不能在控制台中显示。这是一个source of an embarrasing problem,当时 Google Cast 扩展(即公开资源)将其用作检测方法。
s.onload = function()alert("installed");
s.error = function()alert("I still don't know");
请注意,您无法区分两者。在内部,Chrome 将其中一个请求重定向到 chrome-extension://invalid
,但这种重定向对您的代码是透明的:无论是加载资源(像您一样)还是使用 XHR。即使是应该对重定向提供更多控制的新 Fetch API 也无济于事,因为它不是 HTTP 重定向。它得到的只是一个无意义的网络错误。
因此无法检测到扩展是未安装还是已安装,但不会暴露资源。
请理解这是故意的。您所指的方法曾经有效 - 您可以获取任何已知名称的资源。但这是一种指纹浏览器的方法——谷歌明确称其为“恶意”并希望阻止这种方法。
因此,Chrome 18 中引入了 web_accessible_resources
模型(一直追溯到 2012 年 8 月),以保护扩展免遭嗅探 - 要求暴露的 explicitly declare resources。引用,强调我的:
在清单版本 2 之前,可以从网络上的任何页面访问扩展程序中的所有资源。 这使得恶意网站可以识别用户已安装的扩展程序或利用已安装扩展程序中的漏洞(例如 XSS 错误)。将可用性限制为仅可通过 Web 访问的资源可以最大限度地减少可用的攻击面并保护用户的隐私。
在 Google 积极打击指纹识别的情况下,只有合作的扩展程序才能被可靠地检测到。 可能存在特定于扩展的黑客攻击 - 例如特定的 DOM 更改、请求拦截或您可以获取的暴露资源 - 但没有通用方法,并且扩展可能随时更改其“可见签名”。我在这个问题中解释了它:javascript check if user has a third party chrome extension installed,但我希望你能更好地看到这个原因。
总而言之,如果您确实找到了一种通用方法,可以将任意扩展暴露给指纹识别,那么这将被视为 Chrome 中的恶意和隐私漏洞。
【讨论】:
感谢您的宝贵时间。【参考方案2】:让您的 Chrome 扩展程序在您的页面上查找具有非常特定 ID 的特定 DIV 或其他元素。
例如:-
<div id="ExtensionCheck_JamesEggersAwesomeExtension"></div>
【讨论】:
您可以使用 chrome.management.getAll() 获取已安装扩展的列表,其中包含比其 ID 更多的信息。 我认为这是一个扩展开发者的解决方案。以上是关于如何检测浏览器上的扩展程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何检测在 iOS 8 上包含应用程序时启用了应用程序扩展?
如何在不重新加载页面的情况下从 FF Web 扩展内容脚本更改 3rd 方网站上的 Angular 应用程序路由/URL