2013-02-12 3 views
0

Я работаю над простым расширением firefox, которое отслеживает запрашиваемый url и вызывает веб-службу на заднем плане, которая определяет, является ли URL подозрительным или нет, и на основе полученного результата службой, расширение решает остановить загрузку страницы и предупредить пользователя о случае подделки или что-то еще, и если пользователь по-прежнему хочет перейти на эту страницу, он может перенаправляться на исходную страницу, которую он запросил дляРасширение Firefox: остановка загрузки страницы при обнаружении подозрительного URL

I добавил HTTP-на-изменение-запрос наблюдателя

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

и наблюдатель

var requestObserverListener = {observe: function (subject, topic, data) { 

    //alert("Inside observe"); 
    if (topic == "http-on-modify-request") { 
    subject.QueryInterface(Components.interfaces.nsIHttpChannel); 
    var url = subject.URI.spec; //url being requested. you might want this for something else 
    //alert("inside modify request"); 

    var urlbarvalue = document.getElementById("urlbar").value; 
    urlbarvalue = processUrl(urlbarvalue, url); 
    //alert("url bar: "+urlbarvalue); 
    //alert("url: "+url); 
    document.getElementById("urlbar").style.backgroundColor = "white"; 
    if(urlbarvalue == url && url != "") 
    { 
     var browser = getWindowForRequest(subject); 
     if (browser != null) { 
      //alert(""+browser.contentDocument.body.innerHTML); 
      alert("inside browser: "+url); 
      getXmlHttpRequest(url); 
     } 
    } 
    } 

}, 
} 

так, когда URL в URLbar и запрошенный URL соответствует REST службы будет называться через AJAX getXmlHttpRequest (URL); метод

теперь, когда я бегу этот внутренний вызов сделан на службу, но до сервиса вернуть какой-либо ответ страница будет загружаться, не подходит, так как пользователь может ввести свои учетные данные в это время и компрометации

Я хочу сначала отобразить пользователю предупреждение на вкладке браузера, и если он все еще хочет посетить эту страницу, он может быть перенаправлен на эту страницу по ссылке, нажав в окне предупреждающих сообщений.

ответ

3

Я еще не пробовал этот код поэтому я не уверен, что suspend и resume будут работать хорошо, но вот что я хотел бы попробовать. Вы работаете с объектом nsIRequest как ваш subject, поэтому вы можете позвонить ему subject.suspend(). Оттуда используйте обратные вызовы к вашему вызову XHR либо cancel(), либо resume() nsIRequest.

Вот соответствующий (непроверенный) фрагмент кода. Мой XHR предполагает какое-то обещание .the (возвращение), но, надеюсь, вы понимаете, о своем намерении:

if(urlbarvalue == url && url != "") 
    { 
     var browser = getWindowForRequest(subject); 
     if (browser != null) { 
     // suspend the pending request 
     subject.suspend(); 
     getXmlHttpRequest(url).then(
            function success() { subject.resume(); }, 
            function failure() { subject.cancel(Components.results.NS_BINDING_ABORTED); }); 
     } 
    } 

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

Для каждого запроса HTTP будет очень медленно выполнять удаленный вызов. Модуль безопасного просмотра делает один вызов для загрузки базы данных с сайтов, которые считаются «небезопасными», а затем может быстро проверять базу данных на странице запроса HTTP, так что ей не нужно делать индивидуальные вызовы каждый раз.

Вот еще информации по этому виду перехватывающие стоит читать: https://developer.mozilla.org/en-US/docs/XUL/School_tutorial/Intercepting_Page_Loads#HTTP_Observers

Кроме того, я бы беспокоиться, что ваш запрос XHR будет на самом деле цикл, потому что XHR вызовы создает http-on-modify-request события, так что ваш код может реально проверить, что ваш запрос XHR действителен перед тем, как проверить текущий URL. Вероятно, вам нужна проверка безопасности для домена проверки URL.

А вот еще StackOverflow подобный вопрос к твоему, которые могут быть полезны: How to block HTTP request on a particular tab?

Удачи!

+0

subject.suspend() и subject.resume() работают как ожидалось, но subject.cancel (Components.results.NS_BINDING_SUCCEEDED) не отменяет запрос, а запрос все еще находится в состоянии приостановления. –

+1

О, это, вероятно, ошибка копирования/вставки в коде. Я считаю, что вы хотите: subject.cancel (Components.results.NS_BINDING_ABORTED); –

Смежные вопросы