检查用户是否安装了第三方Chrome扩展程序

3

我目前正在尝试检测用户是否安装了某个Chrome扩展程序。该Chrome扩展程序不是我自己的,我也没有其源代码。我已经尝试了许多帖子中提到的方法,但都失败了。接下来详细说明了我尝试过的方法以及失败原因。

执行以下代码会导致“无法读取未定义的属性connect”:

var myPort=chrome.extension.connect('idldbjenlmipmpigmfamdlfifkkeaplc', some_object_to_send_on_connect);

尝试按照以下方式加载扩展资源以测试其是否存在,但是在浏览器中转到此URL会导致Chrome错误页面显示“未找到文件”(请注意,我通过访问Windows本地机器上的C:\ Users \\ AppData \ Local \ Google \ Chrome \ User Data \ Default \ Extensions \ idldbjenlmipmpigmfamdlfifkkeaplc \ 1.0.0.1_0路径找到了此路径):

chrome-extension://idldbjenlmipmpigmfamdlfifkkeaplc/1.0.0.1_0/icon_16.png

使用Chrome管理,但执行时会出现控制台错误“无法读取未定义的属性get”。
chrome.management.get("idldbjenlmipmpigmfamdlfifkkeaplc", function(a){console.log(a);});

我遇到的大部分答案似乎都涉及到扩展是由试图检查它的同一人编写的。


@wOxxOm在第二句话中指出这是第三方扩展。 - Xan
抱歉,我假设是网页代码。对不起。 - Xan
@wOxxOm 哦,我知道为什么我会这样假设。chrome.extension.connect将在任何扩展上下文中定义。 - Xan
请考虑遵循如何检测浏览器扩展程序的建议。 - Michael Freidgeim
1个回答

5

假设你需要从网站获取信息

connect/message方法意味着扩展程序明确将您的网站列入其预期连接来源列表。这很不可能,除非您自己编写了此扩展程序,因为它不能使用通配符域名。

在 web 上下文中引用扩展程序内的文件会返回 404模拟网络错误,除非扩展程序将其声明为可访问的 Web 资源。在 2012 年之前,这是有效的,但 Google 关闭了这个指纹识别方法-现在扩展程序必须明确列出可以访问的资源。您特别提到的扩展程序没有将任何文件列为可访问的 Web 资源,因此该路线也被关闭了。

chrome.management是一个扩展程序 API;网站根本无法使用它。

最后,如果扩展程序具有某种方式修改您网页的 DOM 的内容脚本,则可以检测到这些更改。但这不是非常可靠的,因为内容脚本可以更改它们的逻辑。同样,在您的特定情况下,扩展程序侦听 DOM 事件,但并没有明确表明事件已被接收-因此该路线也被关闭了。

请注意,在一般情况下,您无法确定内容脚本代码是否与您的代码一起运行,因为它在隔离的上下文中运行

总之,这个问题没有什么魔法解决方案。扩展程序必须合作才能被发现,您无法绕过它。

假设你需要从另一个扩展程序获取信息

connect/message方法白名单默认适用于所有扩展程序;但是,为了使其工作,目标扩展程序需要侦听onConnectExternalonMessageExternal事件,这不常见。

可通过其他扩展程序访问 Web 可访问资源的限制相同,因此情况并不好转。

使用自己的内容脚本观察页面更改是可能的,但是可能没有可观察到的内容,并且不能依赖这些更改始终相同。

与扩展程序-网页交互类似,来自不同扩展程序的内容脚本在隔离上下文中运行,因此无法直接“捕获”正在运行的代码。

chrome.management API 是检测第三方扩展程序是否安装的唯一可靠方法,但请注意,它需要 获得 "management" 权限,并伴随着一些令人不安的警告。


对于其他遇到相同问题的人,需要记住 chrome.management API 仅在后台脚本中可用。在内容脚本中它会返回 undefined - Amir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接