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 扩展

堆栈溢出所需的外部 JavaScript 问题 [关闭]

SwiftUI:如何将内容阻止程序应用于 chrome?

Contents.js 阻止页面加载 chrome 扩展

Chrome WebRequest API:如何阻止“设置Cookie”?

如何在GMAILS Chrome扩展程序中阻止图像加载?