Chrome 扩展:阻止来自外部域的内容被加载到特定域的页面中
Posted
技术标签:
【中文标题】Chrome 扩展:阻止来自外部域的内容被加载到特定域的页面中【英文标题】:Chrome Extension: Blocking content from external domain being loaded into pages from specific domain 【发布时间】:2014-03-04 21:05:15 【问题描述】:我正在构建一个在我无法控制的社交网站上使用的扩展程序。该网站允许用户插入来自其他域的内容(图像、flash 等)。我想阻止这个。
我最初认为触发 jquery document.ready 并在那时从 html 中删除内容会很好,因为 document ready 在加载 dom 但内容尚未加载时触发。我只是清空必要的 div 元素,希望这会阻止 http 请求的发生。不幸的是,这种技术不起作用。
然后我发现 chrome.webRequest 似乎可行。我遇到的困难是仅针对我所在的域进行扩展。 Chrome.webRequest 只能用于后台页面,不能用于内容脚本。
我最初的清单权限看起来像这样:
"permissions": [
"tabs",
"http://www.example.com/*",
],
但后来我使用 chrome.webRequest.onBeforeRequest.addListener 记录了请求,我注意到只记录了扩展程序所针对的站点的图像请求。所以我将权限更改为:
"permissions": [
"tabs",
"<all_urls>",
"webRequest",
"webRequestBlocking"
],
我现在可以使用 chrome.webRequest.onBeforeRequest.addListener 查看所有请求。但是,因为此事件是在后台页面中触发的,所以它会针对我在浏览器中访问的所有域和域触发。当我阻止加载图像时,它会阻止所有站点上的所有图像加载。
问题是 chrome.webRequest.onBeforeRequest.addListener 返回的对象不包含用户当前所在选项卡的 url。只言片语。请求中没有任何内容可以看出我可以检测到当前选项卡所在的域。我显然可以使用 chrome.tabs.query 获取带有标签 ID 的 tab.url,但这与 onBeforeRequest 监听器事件一样是异步的。
这是目前的事件监听代码:
chrome.webRequest.onBeforeSendHeaders.addListener(
function(details)
if(details.type == "image" && (details.url.indexOf("://www.example.com") == -1))
console.log(details.url);
//THIS LOGS ALL IMAGES LOADING EXCEPT THE SITE THE EXTENSION IS FOR
//BUT THE CANCEL ALSO CANCELS IMAGES LOADING ON ALL OTHER SITES.
return cancel: true;
,
urls: ["<all_urls>"],
["blocking"]);
简而言之,当正在加载的图像(可以是来自任何地方的图像)被加载到扩展程序所针对的站点时,我如何只运行取消代码?
最后(如果我可以让它工作的话)Firefox 是否有与 chrome.webrequest 类似的选项,因为我想构建一个等效的 Firefox 插件。
【问题讨论】:
我没有给出深入的解决方案,所以我只是发表评论 - 本文中看到的 nsIContentPolicy HERE 谢谢。但该链接指向 Bing 搜索而不是网页 Noitidart。 nslContentPolicy 也是 firefox 的东西还是 chrome 的东西或两者兼而有之?看看我能找到什么。 糟糕,这是MDN - nsiContentPolicty上的文章 【参考方案1】:你去吧,解决方案已经存在,所以不要接受这个作为解决方案,但我在这里发布,所以它很好,很重要,让所有人都能看到:
An example of nsIContentPolicy for firefox addon?
【讨论】:
以上是关于Chrome 扩展:阻止来自外部域的内容被加载到特定域的页面中的主要内容,如果未能解决你的问题,请参考以下文章
Ajax 调用在 HTTPS 上被阻止 - Chrome 扩展