首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何禁用特定的http-request to non disable based url?

如何禁用特定的http-request to non disable based url?
EN

Stack Overflow用户
提问于 2012-03-05 21:21:06
回答 1查看 607关注 0票数 0

我想花几天时间学习firefox的扩展开发。我正在尝试创建类似于RequestPolicy的东西。但我有麻烦了。我想做的是做一个扩展,禁用跨站点请求。现在,我已经编写了类似这样的代码;

代码语言:javascript
复制
var httpRequestObserver = {
    observe : function(aSubject, aTopic, aData) {
    if (aTopic == "http-on-modify-request") {        

      var httpChannel = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);  

      var referrerHost = httpChannel.referrer.host;
      var requestedHost = httpChannel.originalURI.host;      
      var patt = new RegExp(referrerHost);

      if ( !(patt.test(requestedHost)) ) {
          alert("Referrer Host: "+referrerHost+" Requested Host: "+requestedHost+" is NOT SAME ");
      httpChannel.cancel(Components.results.NS_BINDING_ABORTED);
      }
    }
  } 
}


var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                .getService(Components.interfaces.nsIObserverService);
observerService.addObserver(httpRequestObserver, "http-on-modify-request", false);

但是,这段代码取消了所有的请求,而我只想取消'requestedHost‘。为了清楚起见,假设我们有一个foo.com,它使用来自bar.com的图像,当我使用上面的代码片段时,浏览器无法打开foo.com,我想要做的是,打开foo.com并从bar.com禁用img。

提前感谢,对不起,我的英语还不错。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-05 23:41:24

现在还不太清楚你想要实现什么。根据你的问题,你想要这样:

  • foo.com => bar.com
    • foo.comblock =>:allow
    • foo.com => foo.com:block

这里正确的检查非常简单:

代码语言:javascript
复制
if (referrerHost != requestHost) {
  httpChannel.cancel(Components.results.NS_BINDING_ABORTED);

但我认为您最有可能的意思是允许在同一个域中进行通信:

  • foo.com => bar.com
    • foo.com => sub.foo.com:allow
    • sub.foo.com => bar.com:allow
    • sub.foo.com => sub.foo.com:allow
    • sub.foo.com

要正确确定域名,可以使用nsIEffectiveTLDService

代码语言:javascript
复制
var eTLDService = Components.classes["@mozilla.org/network/effective-tld-service;1"]
                  .getService(Components.interfaces.nsIEffectiveTLDService);
try
{
  var referrerDomain = eTLDService.getBaseDomain(httpChannel.referrer);
  var requestDomain = eTLDService.getBaseDomain(httpChannel.originalURI);
  if (referrerDomain != requestDomain)
    httpChannel.cancel(Components.results.NS_BINDING_ABORTED);
}
catch (e)
{
  Components.utils.reportError(e);
}

但即使在这里,你仍然会有问题。考虑一下用户点击谷歌上的链接去foo.com -该请求的引用者将是google.com,而请求的域名将是foo.com,所以你的代码将阻止它。我猜您不想阻止顶级请求,但我怀疑您无法将它们与观察者区分开来-您需要一个progress listenercontent policy来实现这一点。

注意:通过添加*$third-party过滤器,您可以使用Adblock Plus扩展获得想要的效果。众所周知,这种过滤器可以破坏许多网站--跨域的交流比人们预期的要普遍得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9567343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档