Как отключить определенные http-запросы для URL, не основанных на источнике? - PullRequest
0 голосов
/ 05 марта 2012

Я пытаюсь изучить разработку расширений для 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);

Но этот код отменяет все запросы, в то время как я просто хочу отменить «selectedHost». Чтобы было понятно; Допустим, у нас есть foo.com, который использует изображение с bar.com, когда я использую приведенный выше фрагмент кода, браузер не может открыть foo.com, я хочу открыть foo.com и просто отключить IMG от bar.com.

Заранее спасибо, и извините за мой приличный английский.

1 Ответ

1 голос
/ 05 марта 2012

Не совсем понятно, чего вы пытаетесь достичь. По вашему вопросу вы хотите это:

  • foo.com => bar.com: блок
  • foo.com => foo.com: разрешить
  • foo.com => sub.foo.com: блок
  • sub.foo.com => foo.com: блок

Правильная проверка здесь будет чрезвычайно простой:

if (referrerHost != requestHost) {
  httpChannel.cancel(Components.results.NS_BINDING_ABORTED);

Но я думаю, что вы, скорее всего, хотели разрешить общение в пределах одного домена:

  • foo.com => bar.com: блок
  • foo.com => foo.com: разрешить
  • foo.com => sub.foo.com: разрешить
  • sub.foo.com => 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);
}

Но даже здесь у вас все равно будут проблемы. Предположим, что пользователь нажимает на ссылку в Google, ведущую на foo.com - реферер этого запроса будет google.com, а запрашиваемый домен - foo.com, поэтому ваш код заблокирует его. Я предполагаю, что вы не хотите блокировать запросы верхнего уровня, но я сомневаюсь, что вы можете отличить их от наблюдателя - вам понадобится обработчик прогресса или политика содержимого для этого .

Примечание : Вы можете получить желаемый эффект с помощью расширения Adblock Plus, добавив фильтр *$third-party. Известно, что этот фильтр нарушает работу многих веб-сайтов - общение за пределами домена происходит чаще, чем можно было бы ожидать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...