Chrome拡張機能が特定のWebサイトで実行されるのをブロックすることは可能ですか?
私がウェブサイトを持っているとしましょう www.foo.com 、Chrome拡張機能(特にコンテンツスクリプト)が私のウェブサイトで動作するのをブロックすることは可能ですか、または彼らがDOMにアクセスするのを止めますか?
質問への短い回答については、4番目の編集に進んでください:
それが機能するように、ブロックしたい拡張機能からextensionIdを知る必要があります。
これが概念実証からのテストサイトです テストサイト
ソリューションの背後にある情報は次のとおりです。 Chromeアドオンハッキング:フィンガープリント)の概要
実行中の拡張機能がわかったので、リダイレクト/ブロック/ ...
お役に立てば幸いです。
編集:
Windows XPで(Chromeバージョン27.0.1453.94)でテスト済み
編集2:
この手法は、次の場合にのみ機能します。
編集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:
それ自体をブロックできるとは思いませんが、上記のように拡張機能を検出できれば、次のことができます。
もう1つの答えは、実際に拡張機能を停止することについては何も答えていなかったので、私は自分の2セントを追加すると思いました。他の回答の方法を使用すると、時々特定の拡張機能がインストールされているかどうかを検出し、それに応じて対応できますが、これには特定のIDをテストする必要がありますその特定の拡張子の文字列とファイル。これがあまり包括的な解決策ではないことに私たちは皆同意できると確信しています。
Adblockが利用するchrome.webRequest
apiなど、サイト内から停止できない拡張機能については多くのことがあります。この種のコードに直接干渉するためにできることは何もありませんが、DOM操作側でできることはたくさんあります。
Content Scripts
はisolated 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を保持する必要があります。