son*_*oom 20 javascript dom google-chrome google-chrome-extension
是否可以阻止Chrome Extensions在特定网站上运行?
假设我有一个网站www.foo.com,我是否可以阻止Chrome Extensions(特别是内容脚本)在我的网站上工作,或阻止他们访问DOM?
Bea*_*ist 13
由于另一个答案没有真正回答关于实际停止扩展的任何问题,我想我会加上自己的两分钱.使用另一个答案中的方法,您有时可以检测是否安装了特定扩展并做出相应的反应,但这需要您测试该特定扩展名的特定ID字符串和文件.我相信我们都同意这不是一个非常有说服力的解决方案.
您无法在网站中停止使用扩展程序,例如chrome.webRequestadblock使用的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);
});
Run Code Online (Sandbox Code Playgroud)
将其投入带有简单清单的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"]
}]
}
Run Code Online (Sandbox Code Playgroud)
导航到http://example.iana.org/将显示DOM的外部操作(除了某些属性,我没有在那里编写所有内容)不再可能.当然,在这种情况下,内部操作也被拒绝,但如果代码在网站而不是扩展,那将是一个不同的故事.虽然这不会完全禁用扩展,但它至少应该保留您的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 -->
Run Code Online (Sandbox Code Playgroud)
一些上下文: JSONView扩展有一个版本2 Manifest:
...
"manifest_version": 2,
"name": "JSONView",
...
Run Code Online (Sandbox Code Playgroud)
因此,默认情况下,您无法访问上面"概念证明"中提到的清单文件.
但它使用Manifest中的"web_accessible_resources"属性,该属性允许网站从Extension中访问文件.
...
"web_accessible_resources": [ "jsonview.css", "jsonview-core.css", "content_error.css", "options.png", "close_icon.gif", "error.gif" ]
...
Run Code Online (Sandbox Code Playgroud)
所以现在你可以从你的网页上调用这些文件中的任何一个.
例:
chrome-extension://chklaanhfefbnpoihckbnefhakgolnmc/error.gif
chrome-extension://chklaanhfefbnpoihckbnefhakgolnmc/jsonview.css
...
Run Code Online (Sandbox Code Playgroud)
如果onload事件触发,你可以在Image/Script/.. -Tag中使用此url知道扩展是否存在.
Ps:我只在Windows XP上使用Chrome版本27.0.1453.94进行了测试,在其他版本中它可能无效.(见TJ Crowder的评论)
PP:有关详细信息,请查看Chrome开发人员资源.这里是链接到扩展的Chrome浏览器的ressource页"手指印"的东西)
编辑4:
我不认为它本身可以被阻止,但如果您能够检测到如上所述的扩展,您可以:
| 归档时间: |
|
| 查看次数: |
12813 次 |
| 最近记录: |