Firefox扩展:发现可疑网址时停止加载页面

时间:2013-02-12 05:30:45

标签: javascript firefox firefox-addon

我正在开发一个简单的firefox扩展程序,它跟踪请求的url并在后台调用Web服务,该服务检测URL是否可疑,并根据服务返回的结果,扩展程序决定停止页面加载并提醒用户有关伪造或其他任何情况,如果用户仍希望转到该页面,他可以被重定向到他要求的原始页面

我添加了一个http-on-modify-request observer

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栏中的网址与请求的网址匹配 REST服务时,将通过ajax getXmlHttpRequest(url); 方法

调用

现在,当我运行此扩展时,会对服务进行调用,但在服务返回任何响应之前,页面会被加载,这是不合适的,因为用户可能同时输入他的凭据并受到损害

我想首先在浏览器标签上显示用户警告消息,如果他仍想访问该页面,则可以在链接上将其重定向到该页面,然后单击警告消息窗口

1 个答案:

答案 0 :(得分:3)

我没有尝试过这段代码,所以我不确定suspendresume是否能正常运行,但这就是我要尝试的内容。您正在使用nsIRequest对象作为subject,因此您可以在其上调用subject.suspend()。从那里使用回调到您的XHR调用,转发到cancel()resume() nsIRequest。

这是相关的(未经测试的)代码片段。我的XHR承担了某种承诺。()返回但希望你能理解其意图:

  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事件,因此您的代码可能会在检查当前URL之前检查您的XHR请求是否有效。您可能希望对URL检查域进行安全检查。

这是另一个类似问题的stackoverflow可能对您有用:How to block HTTP request on a particular tab?

祝你好运!