网站可以屏蔽Chrome扩展程序吗?

son*_*oom 20 javascript dom google-chrome google-chrome-extension

是否可以阻止Chrome Extensions在特定网站上运行?

假设我有一个网站www.foo.com,我是否可以阻止Chrome Extensions(特别是内容脚本)在我的网站上工作,或阻止他们访问DOM?

Bea*_*ist 13

由于另一个答案没有真正回答关于实际停止扩展的任何问题,我想我会加上自己的两分钱.使用另一个答案中的方法,您有时可以检测是否安装了特定扩展并做出相应的反应,但这需要您测试该特定扩展名的特定ID字符串和文件.我相信我们都同意这不是一个非常有说服力的解决方案.

您无法在网站中停止使用扩展程序,例如chrome.webRequestadblock使用的API.没有什么可以直接干扰那种代码,但是你可以在DOM操作方面做很多事情.

Content Scripts操作的isolated world意思是他们无法看到/与网站上运行的javascript交互.但是,他们可以完全访问DOM并可以执行任何他们想要的操作.相反,您自己的javascript对该DOM具有相同的访问权限.利用这一点,isolated world我们可以设置一个MutationObserver监视DOM并防止任何不必要的更改.因为isolated world,content scripts不能禁用或关闭我们的观察员,而我们自己的JavaScript可以这样做的自由.

这是一个MutationObserver用一点点jQuery混合锁定DOM 的例子,因为我很懒.

var config= {childList: true,
             attributes: true,
             characterData: true, 
             subtree: true, 
             attributeOldValue: true, 
             characterDataOldValue: true};
var observer = new MutationObserver(function(mutations){
  mutations.forEach(function(mutation){
    switch(mutation.type){
      case "attributes":
        observer.disconnect();
        if(mutation.attributeName == "class")
         mutation.target.className = mutation.oldValue;
        else if(mutation.attributeName=="id"||mutation.attributeName=="title")
         mutation.target[mutation.attributeName] = mutation.oldValue;
        else if(mutation.attributeName == "style")
          mutation.target.style.cssText = mutation.oldValue;
        observer.observe(document,config);
        break;
      case "characterData":
        observer.disconnect();
        mutation.target.data = mutation.oldValue;
        observer.observe(document,config);
        break;
      case "childList":
        observer.disconnect();
        if(mutation.addedNodes.length > 0)
          $(mutation.addedNodes[0]).remove();
        if(mutation.removedNodes.length > 0){
          if(mutation.nextSibling)
            $(mutation.removedNodes[0]).insertBefore(mutation.nextSibling);
          else if(mutation.previousSibling)
            $(mutation.removedNodes[0]).insertAfter(mutation.previousSibling);
          else
            $(mutation.removedNodes[0]).appendTo(mutation.target);
        }
        observer.observe(document,config);
        break;
    }
  });
});

$(function(){
  observer.observe(document,config);
});
Run Code Online (Sandbox Code Playgroud)

将其投入带有简单清单的chrome扩展名,例如:

{
  "name": "DOM Polymerase",
  "version": "1.0",
  "manifest_version": 2,
  "permissions": [
    "tabs","<all_urls>"
  ],
  "content_scripts": [{
    "matches": ["http://example.iana.org/*"],
    "js": ["jquery-1.8.3.min.js","polymerase.js"]
  }]
}
Run Code Online (Sandbox Code Playgroud)

导航到http://example.iana.org/将显示DOM的外部操作(除了某些属性,我没有在那里编写所有内容)不再可能.当然,在这种情况下,内部操作也被拒绝,但如果代码在网站而不是扩展,那将是一个不同的故事.虽然这不会完全禁用扩展,但它至少应该保留您的DOM.

  • @MrMesees 该扩展程序可以选择在现有网页中的任何内容之前运行。这意味着它可以在页面调用“new MutationObserver”之前覆盖“MutationObserver”(或几乎任何其他内容)。因此,页面设置为“MutationObserver”的内容可以是扩展控制的内容。所有数据都会发送到页面脚本的观察者。在这种情况下,扩展程序可以执行一些简单的操作,例如从不调用观察者的函数,或者执行更复杂的任务,从报告给页面观察者的更改中过滤掉扩展程序所做的所有更改。 (2认同)

win*_*ner 9

对于问题的简短回答转到第4编辑:

您需要知道要阻止的扩展的extensionId,以便它可以工作.

这是一个来自概念证明测试的 测试

以下是解决方案背后的信息: Chrome插件黑客简介:指纹识别

既然您知道扩展正在运行,您可以重定向/阻止/ ...

我希望它有所帮助.

编辑:

在Windows XP上测试(Chrome版本27.0.1453.94)

编辑2:

此技术仅适用于:

  1. 你知道扩展名:)
  2. 重要!至少一个Ressource(如manifest.json,一些图像,脚本,......)设置为"web_accessible_resources"(在清单中)或者扩展仍然使用清单版本1并且没有设置"web_accessible_resources".(从chrome dev网站链接获取资源)

编辑3:

案例扩展:JSONView

您可以使用此代码检测扩展名(仅示例代码):

<script src="chrome-extension://chklaanhfefbnpoihckbnefhakgolnmc/error.gif" onerror="console.info('Extension Not Found')" onload="console.info('Extension Found')"></script>
<!-- since the the file error.gif is allowed in the manifest "web_accessible_resources" (any other file mentioned there would also be fine) -->
<!-- the block code should come in the onload of the script tag -->
<!-- tested with Chrome 27+ WinXp -->
Run Code Online (Sandbox Code Playgroud)

一些上下文: JSONView扩展有一个版本2 Manifest:

...
"manifest_version": 2, 
"name": "JSONView",
...
Run Code Online (Sandbox Code Playgroud)

因此,默认情况下,您无法访问上面"概念证明"中提到的清单文件.

它使用Manifest中的"web_accessible_resources"属性,该属性允许网站从Extension中访问文件.

...
"web_accessible_resources": [ "jsonview.css", "jsonview-core.css", "content_error.css", "options.png", "close_icon.gif", "error.gif" ]
...
Run Code Online (Sandbox Code Playgroud)

所以现在你可以从你的网页上调用这些文件中的任何一个.

例:

chrome-extension://chklaanhfefbnpoihckbnefhakgolnmc/error.gif
chrome-extension://chklaanhfefbnpoihckbnefhakgolnmc/jsonview.css
...
Run Code Online (Sandbox Code Playgroud)

如果onload事件触发,你可以在Image/Script/.. -Tag中使用此url知道扩展是否存在.

Ps:我只在Windows XP上使用Chrome版本27.0.1453.94进行了测试,在其他版本中它可能无效.(见TJ Crowder的评论)

PP:有关详细信息,请查看Chrome开发人员资源.这里是链接到扩展的Chrome浏览器的ressource页"手指印"的东西)

编辑4:

我不认为它本身可以被阻止,但如果您能够检测到如上所述的扩展,您可以:

  • 从您的页面重定向
  • 或弹出一条消息(每隔几秒钟)说"禁用此站点的扩展"
  • 或者你可以检查扩展代码,看看你是否可能"破坏"或阻碍其功能.
  • 或者你可以在BeardFist的答案中使用一些代码

  • 我认为不再适用,Google修补了这个漏洞.同样,[他的另一篇文章](http://blog.kotowicz.net/2012/02/intro-to-chrome-addons-hacking.html)中关于检测特定扩展的机制也不再适用.例如,[此测试页](http://jsbin.com/abeyox/1)(来源:http://jsbin.com/abeyox/1/edit)尝试检测快速拨号扩展.但是当我安装并启用了快速拨号时,它无法检测到它,因为(正如我们在网络选项卡中看到的那样)Chrome现在可以阻止脚本标记技巧的运行. (3认同)