是否可以阻止Chrome扩展程序在特定网站上运行?
假设我有一个网站www.foo.com,是否可以阻止Chrome扩展程序(特别是内容脚本)在我的网站上工作,或阻止他们访问DOM?
答案 0 :(得分:13)
由于另一个答案没有真正回答有关实际停止扩展的任何问题,我想我会加上自己的两分钱。使用另一个答案中的方法,您可以有时检测是否安装了特定扩展并做出相应的反应,但这需要您测试该特定扩展名的特定ID字符串和文件。我相信我们都同意这不是一个非常有说服力的解决方案。
有很多关于您无法在网站中停止的扩展程序的内容,例如adblock使用的chrome.webRequest
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);
});
将其放入带有简单清单的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:
此技术仅在以下情况下有效:
编辑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:
我不认为它本身可以被阻止,但如果您能够检测到如上所述的扩展,您可以: