在 JavaScript 中区分内联网和外部 IP 地址
Distinguish Intranet and external IP addresses in JavaScript
我正在编写一个浏览器插件(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地址。
- 调整窗口大小时,可拖动的对象会出现在容器外部
- HTML表单提交时未执行外部函数
- 通过在Dojo mobile ViewController.openExternalView中动态更改打开同一外部视图的
- 使用html中的外部javascript进行数据验证
- 从远程脚本获取用户IP
- 将变量传递给外部Javascript
- 使用javascript在Flash中加载外部图像
- Firebase2(Firebase.google.com)推送通知-从外部管理
- 如何更改reactjs中外部/独立组件的状态或属性
- 跟踪用户点击Adsense广告的IP地址
- 如何从外部页面激活非默认引导选项卡
- 如何在运行时在angular 2中加载外部js脚本
- JavaScript-在手机上不工作的情况下,在外部单击时隐藏元素
- 单击元素外部时进行JQuery
- 我的外部js文件无法加载
- 如何使用Javascript知道页面访问者的IP地址,而无需使用任何外部站点/响应程序
- 在 JavaScript 中区分内联网和外部 IP 地址
- Node.js无法从外部IP访问
- 返回内部和外部IP
- 来自一个外部 IP 地址的 WebSocket 客户端