在 JavaScript 中区分内联网和外部 IP 地址

Distinguish Intranet and external IP addresses in JavaScript

本文关键字:外部 IP 地址 内联网 JavaScript 中区      更新时间:2023-09-26

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

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

理论上,我可以计算出(在合理的准确性范围内(一个 IP 是否可能来自内部网@区分内部网和官方 IP 地址,但由于 DOM 不提供对文档主机 IP 的访问,因此尝试动态确定 IP 然后应用这些 IP 规则是否可行, 考虑到查找服务可能关闭/缓慢的可能性?

更简单的替代方案(例如文档主机名的 TLD 的模式匹配(是否几乎一样好?

有什么建议吗?

更新:

正要自己回答这个问题:">我只会在服务器上进行 IP 检查,当页面统计信息提交时,只有在 IP 不在内部范围内时才完成提交 - 这要容易得多。不幸的是,我不能这样做:因为我的后端是Google AppEngine [Java]并且InetAddress类受到限制,所以我不能进行任意IP查找。

您应该使用 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,则必须使用 chrome 权限,并将对Components属性的访问权限替换为相应的别名。

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