web-dev-qa-db-ja.com

ウェブサイトはChrome拡張機能をブロックできますか?

Chrome拡張機能が特定のWebサイトで実行されるのをブロックすることは可能ですか?

私がウェブサイトを持っているとしましょう www.foo.com 、Chrome拡張機能(特にコンテンツスクリプト)が私のウェブサイトで動作するのをブロックすることは可能ですか、または彼らがDOMにアクセスするのを止めますか?

21
sonicboom

質問への短い回答については、4番目の編集に進んでください:

それが機能するように、ブロックしたい拡張機能からextensionIdを知る必要があります。

これが概念実証からのテストサイトです テストサイト

ソリューションの背後にある情報は次のとおりです。 Chromeアドオンハッキング:フィンガープリント)の概要

実行中の拡張機能がわかったので、リダイレクト/ブロック/ ...

お役に立てば幸いです。

編集:

Windows XPで(Chromeバージョン27.0.1453.94)でテスト済み

編集2:

この手法は、次の場合にのみ機能します。

  1. あなたはextensionidを知っています:)
  2. 重要!少なくとも1つのリソース(manifest.json、一部の画像、スクリプトなど)が「web_accessible_resources」(マニフェスト内)として設定されている)OR拡張機能は引き続きマニフェストバージョン1を使用し、「web_accessible_resources」は設定されていません。(chrome dev site Link

編集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_version": 2, 
"name": "JSONView",
...

そのため、デフォルトでは、上記の「概念実証」で説明したマニフェストファイルにアクセスできません。

[〜#〜] but [〜#〜] "web_accessible_resources"マニフェストの属性。これにより、Webサイトは拡張機能からファイルにアクセスできます。

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

これで、Webページからこのファイルを呼び出すことができます。

例:

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

そして、Image/Script/.. -TagのこのURLを使用すると、onloadイベントが発生した場合に、拡張機能が存在するかどうかを知ることができます。

追伸:これはWindowsXPでChromeバージョン27.0.1453.94)でのみテストしましたが、他のバージョンでは機能しない可能性があります。 (T.J. Crowderからのコメントを参照)

PP:詳細については、Chrome DeveloperRessourcesを確認してください。Chrome Ressource Page "Fingerprinting"スタッフの拡張機能へのリンクは次のとおりです。

編集4:

それ自体をブロックできるとは思いませんが、上記のように拡張機能を検出できれば、次のことができます。

  • ページからリダイレクトします
  • または「このサイトの拡張機能を無効にしてください」というメッセージを(数秒ごとに)ポップアップします
  • または、拡張コードをチェックして、その機能を「壊す」または妨げる可能性があるかどうかを確認することもできます。
  • または、BeardFistの答えのようなコードを使用することもできます
10
winner_joiner

もう1つの答えは、実際に拡張機能を停止することについては何も答えていなかったので、私は自分の2セントを追加すると思いました。他の回答の方法を使用すると、時々特定の拡張機能がインストールされているかどうかを検出し、それに応じて対応できますが、これには特定のIDをテストする必要がありますその特定の拡張子の文字列とファイル。これがあまり包括的な解決策ではないことに私たちは皆同意できると確信しています。

Adblockが利用するchrome.webRequest apiなど、サイト内から停止できない拡張機能については多くのことがあります。この種のコードに直接干渉するためにできることは何もありませんが、DOM操作側でできることはたくさんあります。

Content Scriptsisolated worldで動作します。つまり、サイトで実行されているjavascriptを表示/操作することはできません。ただし、彼らはDOMに完全にアクセスでき、やりたいことは何でもできます。逆に、あなた自身のJavaScriptはそのDOMへの同じアクセス権を持っています。そのisolated worldを利用して、MutationObserverを設定し、DOMを監視し、不要な変更を防ぐことができます。 isolated worldのため、content scriptsはオブザーバーを無効にしたりオフにしたりすることはできませんが、独自のJavaScriptは自由に行うことができます。

これは、私が怠惰であるために少しMutationObserverを混ぜてDOMをロックダウンするjQueryの例です。

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を保持する必要があります。

13
BeardFist