Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 网站可以阻止Chrome扩展吗?_Javascript_Google Chrome_Dom_Google Chrome Extension - Fatal编程技术网

Javascript 网站可以阻止Chrome扩展吗?

Javascript 网站可以阻止Chrome扩展吗?,javascript,google-chrome,dom,google-chrome-extension,Javascript,Google Chrome,Dom,Google Chrome Extension,是否有可能阻止Chrome扩展在特定网站上运行 假设我有一个网站,我是否可以阻止Chrome扩展(特别是内容脚本)在我的网站上工作,或者阻止它们访问DOM?对于问题的简短答案,请转到第四次编辑: 您需要从要阻止的扩展中了解extensionId,这样它才能工作 这里是一个来自概念验证的测试站点 以下是解决方案背后的信息: 现在您知道正在运行哪些扩展,可以重定向/block/ 我希望有帮助 编辑: 在Windows XP上使用(Chrome版本27.0.1453.94)进行测试 编辑2: 此技

是否有可能阻止Chrome扩展在特定网站上运行

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

对于问题的简短答案,请转到第四次编辑:

您需要从要阻止的扩展中了解extensionId,这样它才能工作

这里是一个来自概念验证的测试站点

以下是解决方案背后的信息:

现在您知道正在运行哪些扩展,可以重定向/block/

我希望有帮助

编辑:

在Windows XP上使用(Chrome版本27.0.1453.94)进行测试

编辑2:

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

  • 您知道扩展ID:)
  • 重要至少一个Ressource(如manifest.json、一些图像、脚本等) 设置为“web\u可访问的\u资源”(在清单中)或 扩展仍然使用清单版本1,并且没有“web\u可访问的\u资源”集。(来源于chrome开发站点)
  • 编辑3:

    案例扩展:JSONView

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

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

    但是它使用清单中的“web可访问的资源”属性,允许网站从扩展名访问文件

    ...
    "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
    ...
    
    并在Image/Script/中使用此url-标记您可以知道扩展是否存在,是否触发了onload事件

    注意:我只在WindowsXP上用Chrome版本27.0.1453.94)测试过这个,在其他版本中可能不起作用。(见T.J.Crowder的评论)

    p.p.s.:有关更多详细信息,请查看Chrome开发者资源。这是Chrome资源页面上的扩展链接)

    编辑4:

    我不认为它本身可以被阻止,但是如果你能检测到上面提到的扩展,你可以:

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

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

    关于扩展,有许多事情是你无法从网站内部停止的,比如adblock使用的
    chrome.webRequest
    api。您无法直接干预这类代码,但在DOM操作方面可以做很多事情

    内容脚本
    在一个
    孤立的世界中运行
    ,这意味着它们无法看到站点上运行的javascript或与之交互。然而,他们确实拥有对DOM的完全访问权,并且可以做任何他们想做的事情。相反,您自己的javascript对该DOM具有相同的访问权限。利用这个
    孤立的世界
    我们可以建立一个
    MutationObserver
    来监视DOM并防止任何不必要的更改。由于
    孤立的世界
    内容脚本
    无法禁用或关闭我们的观察者,而我们自己的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"]
      }]
    }
    
    {
    “名称”:“名称”,
    “版本”:“1.0”,
    “清单版本”:2,
    “权限”:[
    
    “tabs”,“将显示DOM的外部操作(除了一些属性,我没有在其中全部编码)不再可能。当然,在这种情况下,内部操作也会被拒绝,但如果代码在站点中而不是在扩展中,情况就不同了。虽然这不能完全禁用扩展,但至少应该保留您的DOM。

    如果这是可能的,ads可以禁用广告拦截器并使其无效。@Joseph德雷默:这取决于机制,但这是一个明确的问题。我不确定,但这在技术上似乎是不可能的。因为您的网站在实际加载您的网站之前,无法命令浏览器停止使用某些扩展或第三方脚本。@Gei:Chrome完全有可能提供对于这一点,不管怎么说,对于大多数扩展来说都是元标签。@T.J.Crowder虽然理论上可能,但我认为谷歌没有真正的动力这么做,因为这会使其繁荣的扩展市场变得毫无用处。我认为这不再有效,谷歌修补了这个漏洞。同样,关于检测特定扩展的机制也不再有效。F或实例,(来源:)尝试检测Speed Dial分机。但尽管我已安装并启用Speed Dial,但它无法检测到它,因为(正如我们在网络选项卡中看到的)Chrome现在阻止脚本标记技巧工作。我尝试了测试页面(Chrome版本27.0.1453.94)扩展被列出。我只能说我用我的浏览器进行了测试。你是否遵循了我答案中的链接?是否列出了扩展?请分享信息,以便我可以完善我的知识。THX@winner\u joiner:是的,我遵循了链接。否,没有列出扩展(我没有
    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);
    });
    
    {
      "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"]
      }]
    }