Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firefox扩展:发现可疑url时停止页面加载_Javascript_Firefox_Firefox Addon - Fatal编程技术网

Javascript Firefox扩展:发现可疑url时停止页面加载

Javascript Firefox扩展:发现可疑url时停止页面加载,javascript,firefox,firefox-addon,Javascript,Firefox,Firefox Addon,我正在开发一个简单的firefox扩展,它跟踪请求的url,并在后台调用一个web服务,检测url是否可疑,根据服务返回的结果,扩展决定停止页面加载,并提醒用户是否存在伪造或其他情况,如果用户仍然希望转到该页面,他可以被重定向到他请求的原始页面 我已经添加了一个关于修改请求的http var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interface

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

我已经添加了一个关于修改请求的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);
        }
    }
  }

},
}
因此,当URLbar中的URL和请求的URL匹配时,REST服务将通过ajaxgetXmlHttpRequest(URL)调用方法

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


我想首先在浏览器选项卡上向用户显示一条警告消息,如果用户仍然想访问该页面,则可以通过在警告消息窗口中单击链接将其重定向到该页面。我还没有尝试过此代码,因此我不确定
挂起
恢复
是否能正常工作,但我会尝试以下方法。您正在使用对象作为
主题
,因此可以对其调用
主题.suspend()
。从那里,使用对XHR调用的回调来调用NSI请求的
cancel()
resume()

下面是相关的(未经测试的)代码片段。我的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请求页面快速检查数据库,这样就不必每次都进行单独调用

以下是关于这种拦截的更多信息,值得一读:

此外,我还担心XHR请求实际上会循环,因为XHR调用会在修改请求时创建一个
http
事件,因此代码可能会在检查当前URL之前检查XHR请求是否有效。您可能需要对URL检查域进行安全检查

这里还有一个与你类似的问题,可能很有用:


祝你好运

我还没有尝试过这段代码,所以我不确定
suspend
resume
是否能正常工作,但下面是我将尝试的内容。您正在使用对象作为
主题
,因此可以对其调用
主题.suspend()
。从那里,使用对XHR调用的回调来调用NSI请求的
cancel()
resume()

下面是相关的(未经测试的)代码片段。我的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请求页面快速检查数据库,这样就不必每次都进行单独调用

以下是关于这种拦截的更多信息,值得一读:

此外,我还担心XHR请求实际上会循环,因为XHR调用会在修改请求时创建一个
http
事件,因此代码可能会在检查当前URL之前检查XHR请求是否有效。您可能需要对URL检查域进行安全检查

这里还有一个与你类似的问题,可能很有用:


祝你好运

subject.suspend()和subject.resume()按预期工作,但subject.cancel(Components.results.NS\u BINDING\u successed)没有取消请求,而请求似乎仍处于挂起状态噢,这可能是代码中的复制/粘贴错误。我相信您需要的是:subject.cancel(Components.results.NS\u BINDING\u ABORTED);subject.suspend()和subject.resume()按预期工作,但subject.cancel(Components.results.NS\u BINDING\u successed)没有取消请求,而请求似乎仍处于挂起状态噢,这可能是代码中的复制/粘贴错误。我相信您需要的是:subject.cancel(Components.results.NS\u BINDING\u ABORTED);