我想花几天时间学习firefox的扩展开发。我正在尝试创建类似于RequestPolicy的东西。但我有麻烦了。我想做的是做一个扩展,禁用跨站点请求。现在,我已经编写了类似这样的代码;
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。
提前感谢,对不起,我的英语还不错。
发布于 2012-03-05 23:41:24
现在还不太清楚你想要实现什么。根据你的问题,你想要这样:
foo.com => bar.com:foo.comblock =>:allowfoo.com => foo.com:block这里正确的检查非常简单:
if (referrerHost != requestHost) {
httpChannel.cancel(Components.results.NS_BINDING_ABORTED);但我认为您最有可能的意思是允许在同一个域中进行通信:
foo.com => bar.com:foo.com => sub.foo.com:allowsub.foo.com => bar.com:allowsub.foo.com => sub.foo.com:allowsub.foo.com要正确确定域名,可以使用nsIEffectiveTLDService
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 listener或content policy来实现这一点。
注意:通过添加*$third-party过滤器,您可以使用Adblock Plus扩展获得想要的效果。众所周知,这种过滤器可以破坏许多网站--跨域的交流比人们预期的要普遍得多。
https://stackoverflow.com/questions/9567343
复制相似问题