是否可以在插件中控制Firefox的DNS请求?

时间:2014-07-02 19:03:41

标签: javascript firefox firefox-addon

我想知道是否有可能拦截和控制/重定向Firefox发出的DNS请求? 目的是在Firefox(而不是系统的DNS服务器)中设置一个独立的DNS服务器

2 个答案:

答案 0 :(得分:3)

不,不是真的。 DNS解析器通过nsIDNSService接口提供。该接口不是完全可编写脚本的,因此您不能仅使用自己的Javascript实现替换内置实现。

但是你可能只是覆盖DNS服务器吗?

内置实施从nsDNSServicensHostResolverPR_GetAddrByName(nspr),最终在getaddrinfo / gethostbyname。并且它使用系统(或实现它的库)配置的任何内容。

还有其他选择吗?

不是真的。您可以安装代理并让它解析域名(当然需要某种代理服务器)。但这是一个非常严重的黑客,我不推荐任何东西(如果用户已经配置了一个真正的,非解析的代理,那么也需要处理它。)

答案 1 :(得分:1)

您可以检测到“问题加载页面”,然后可能会使用redirectTo方法。

基本上他们都加载了about:neterror个网址后面有一堆信息。 IE:

  • about:neterror?e=dnsNotFound&u=http%3A//www.cu.reporterror%28%27afew/&c=UTF-8&d=Firefox%20can%27t%20find%20the%20server%20at%20www.cu.reporterror%28%27afew.
  • about:neterror?e=malformedURI&u=about%3Abalk&c=&d=The%20URL%20is%20not%20valid%20and%20cannot%

但是这个信息是在docuri中保存的。所以你必须这样做。以下是检测问题加载页面的示例代码:

var listenToPageLoad_IfProblemLoadingPage = function(event) {

    var win = event.originalTarget.defaultView;
    var docuri = window.gBrowser.webNavigation.document.documentURI; //this is bad practice, it returns the documentUri of the currently focused tab, need to make it get the linkedBrowser for the tab by going through the event. so use like event.originalTarget.linkedBrowser.webNavigation.document.documentURI <<i didnt test this linkedBrowser theory but its gotta be something like that
    var location = win.location + ''; //I add a " + ''" at the end so it makes it a string so we can use string functions like location.indexOf etc

    if (win.frameElement) {
      // Frame within a tab was loaded. win should be the top window of
      // the frameset. If you don't want do anything when frames/iframes
      // are loaded in this web page, uncomment the following line:
      // return;
      // Find the root document:
      //win = win.top;
      if (docuri.indexOf('about:neterror') == 0) {
          Components.utils.reportError('IN FRAME - PROBLEM LOADING PAGE LOADED docuri = "' + docuri + '"');
      }
    } else {
        if (docuri.indexOf('about:neterror') == 0) {
            Components.utils.reportError('IN TAB - PROBLEM LOADING PAGE LOADED docuri = "' + docuri + '"');
        }
    }
}


window.gBrowser.addEventListener('DOMContentLoaded', listenToPageLoad_IfProblemLoadingPage, true);