javascript - 火狐扩展 : Stopping the page load when suspicious url found

标签 javascript firefox firefox-addon

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

我添加了一个 http-on-modify-request 观察者

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服务将通过ajax调用getXmlHttpRequest(url);方法

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

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

最佳答案

我还没有尝试过这段代码,所以我不确定挂起恢复是否能正常工作,但这是我会尝试的。您正在使用 nsIRequest对象作为您的subject,这样您就可以对其调用subject.suspend()。从那里使用 XHR 回调来调用 cancel()resume() nsIRequest。

这是相关的(未经测试的)代码片段。我的 XHR 假设某种 promise .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?

祝你好运!

关于javascript - 火狐扩展 : Stopping the page load when suspicious url found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14826033/

相关文章:

html - 脚本中的双连字符使 firefox 呈现奇怪

javascript - 通知在 FF Web 扩展中不起作用

javascript - 在 Firefox 的新标签页中打开链接

java - 正则表达式:查找第一次出现并映射到规范值

JavaScript 正则表达式匹配引号内而不是字符集中的字符

javascript - 如何在 React/JSX 中手动创建的数组中设置键?

css - Firefox 上的字体问题

internet-explorer - Firebreath:窗口插件中一个 firebreath 事件的多个事件监听器

javascript - 我究竟做错了什么 ?我收到此错误 : Uncaught ReferenceError: image is not defined

javascript - 如何在 Firefox 插件中使用 JavaScript 访问命名管道?