在JavaScript中区分Intranet和外部IP地址

时间:2012-05-08 19:49:26

标签: java javascript google-app-engine google-chrome-extension firefox-addon

我正在编写一个浏览器插件(Chrome和Firefox),简而言之,根据用户访问的每个页面的内容进行“一些计算”(即我们是不谈论用户的自己的页面),向用户展示分数。在分数特别高的情况下,页面标题,页面URL等(自动)提交给中央服务,以便显示一种联赛表。

所有这一切都很完美,但我希望 - 在可能的情况下 - 从我们的用户碰巧访问的内部网页中去除所有流量。 (我们不存储或传输任何页面内容,但存在隐私问题,我们不希望与内部/公司文档有任何关系。)

理论上,我可以(以合理的准确度)计算出IP是否可能来自内联网@ Distinguish the between intranet and official IP addresses,但由于DOM不提供对文档主机IP的访问,考虑到查找服务可能会降低/减慢的可能性,尝试确定动态IP然后应用这些IP规则是否切实可行?

一个更简单的替代方案 - 如文档主机名的TLD的模式匹配 - 几乎一样好吗?

有什么建议吗?

更新

我正准备用回答这个问题“我只会在服务器上进行IP检查,提交页面统计信息时,如果IP不在内部范围内,则只完成提交 - 这是更容易。“ ...遗憾的是我不能这样做:因为我的后端是Google AppEngine [Java]并且InetAddress类受到限制,我无法进行任意IP查找。

1 个答案:

答案 0 :(得分:2)

您应该使用nsIDNSService来解析Firefox中的主机名。沿着这些方向:

var threadManager = Components.classes["@mozilla.org/thread-manager;1"]
                              .getService(Components.interfaces.nsIThreadManager);
var dnsService = Components.classes["@mozilla.org/network/dns-service;1"]
                           .createInstance(Components.interfaces.nsIDNSService);
var listener = {
  onLookupComplete: function(request, record, status)
  {
    if (Components.isSuccessCode(status))
      alert("Host IP address: " + record.getNextAddrAsString());
    else
      alert("Lookup failed");
  }
};
dnsService.asyncResolve("www.google.com", 0, listener,
                        threadManager.currentThread);

这通常是一个非常快速的操作,因为主机名已经被缓存。注意:如果您使用附加组件SDK,则必须use chrome authority并使用相应的别名替换对Components属性的访问权限。

至于Chrome,我怀疑你能否正确解决这个问题。正如Korvin Szanto在评论中指出的那样,任何主机名都可以指向本地地址。 Chrome不会让您获得与之对话的IP地址。