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

时间:2013-05-28 07:27:32

标签: javascript google-chrome dom google-chrome-extension

是否可以阻止Chrome扩展程序在特定网站上运行?

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

2 个答案:

答案 0 :(得分:13)

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

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

Content Scriptsisolated world运行,这意味着他们无法查看/与网站上运行的javascript交互。但是,他们可以完全访问DOM并可以执行任何他们想要的操作。相反,您自己的javascript对该DOM具有相同的访问权限。利用isolated world我们可以设置MutationObserver来监控DOM并防止任何不必要的更改。由于isolated worldcontent 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);
});

将其放入带有简单清单的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"]
  }]
}

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

答案 1 :(得分:9)

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

您需要知道要阻止的扩展名中的extensionId,以便它可以正常工作。

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

以下是解决方案背后的信息: Intro to Chrome addons hacking: fingerprinting

现在你知道扩展正在运行,你可以重定向/阻止/...

我希望它有所帮助。

修改

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

编辑2:

此技术仅在以下情况下有效:

  1. 你知道扩展名:)
  2. 重要!至少有一个Ressource(比如manifest.json,一些图片,脚本......) 设置为“web_accessible_resources”(在清单中)或者 extension仍然使用清单版本1并且没有设置“web_accessible_resources”。 (从chrome dev网站Link重新获得资源)
  3. 编辑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 -->
    

    某些情境: JSONView扩展具有版本2 Manifest:

    ...
    "manifest_version": 2, 
    "name": "JSONView",
    ...
    

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

    但是它使用清单中的“web_accessible_resources”属性,该属性允许网站访问扩展程序中的文件。

    ...
    "web_accessible_resources": [ "jsonview.css", "jsonview-core.css", "content_error.css", "options.png", "close_icon.gif", "error.gif" ]
    ...
    

    现在您可以从您的网页调用任何此类文件。

    示例:

    chrome-extension://chklaanhfefbnpoihckbnefhakgolnmc/error.gif
    chrome-extension://chklaanhfefbnpoihckbnefhakgolnmc/jsonview.css
    ...
    

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

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

    P.P.s。:有关详细信息,请查看Chrome开发人员资源。以下是Chrome资源页面"Finger printing" Stuff

    上的扩展程序链接

    编辑4:

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

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