gpt4 book ai didi

google-chrome-extension - 如何检测浏览器上的扩展名?

转载 作者:行者123 更新时间:2023-12-05 05:22:32 29 4
gpt4 key购买 nike

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

我试过这个:

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!');});

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

Resources must be listed in the web_accessible_resources manifest key in order to be loaded by pages outside the extension

GET chrome-extension://invalid 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);
}

到目前为止,我无法捕捉到错误..
任何帮助将不胜感激

最佳答案

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

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

When a resource (such as an <img> or <script>) fails to load, an error event using interface Event is fired at the element, that initiated the load, and the onerror() handler on the element is invoked. These error events do not bubble up to window, but (at least in Firefox) can be handled with a single capturing 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 重定向。它得到的只是一个无信息的网络错误。

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


请理解这是有意为之的。您提到的方法曾经有效 - 您可以获取已知名称的任何资源。但这是一种指纹浏览器的方法 - 谷歌明确称其为“恶意”并希望阻止的方法。

因此,web_accessible_resources模型在 Chrome 18 中引入(一直追溯到 2012 年 8 月)以保护扩展免受嗅探 - 需要 explicitly declare resources暴露的。引用,强调我的:

Prior to manifest version 2 all resources within an extension could be accessed from any page on the web. This allowed a malicious website to fingerprint the extensions that a user has installed or exploit vulnerabilities (for example XSS bugs) within installed extensions. Limiting availability to only resources which are explicitly intended to be web accessible serves to both minimize the available attack surface and protect the privacy of users.

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

总而言之,如果您确实找到了一种通用方法来暴露指纹识别的任意扩展,这将被认为是恶意的,并且是 Chrome 中的隐私漏洞。

关于google-chrome-extension - 如何检测浏览器上的扩展名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40356596/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com