我正在编写一个浏览器插件(Chrome和Firefox),简而言之,根据用户访问的每个页面的内容进行“一些计算”(即我们是不谈论用户的自己的页面),向用户展示分数。在分数特别高的情况下,页面标题,页面URL等(自动)提交给中央服务,以便显示一种联赛表。
所有这一切都很完美,但我希望 - 在可能的情况下 - 从我们的用户碰巧访问的内部网页中去除所有流量。 (我们不存储或传输任何页面内容,但存在隐私问题,我们不希望与内部/公司文档有任何关系。)
理论上,我可以(以合理的准确度)计算出IP是否可能来自内联网@ Distinguish the between intranet and official IP addresses,但由于DOM不提供对文档主机IP的访问,考虑到查找服务可能会降低/减慢的可能性,尝试确定动态IP然后应用这些IP规则是否切实可行?
一个更简单的替代方案 - 如文档主机名的TLD的模式匹配 - 几乎一样好吗?
有什么建议吗?
更新
我正准备用回答这个问题“我只会在服务器上进行IP检查,提交页面统计信息时,如果IP不在内部范围内,则只完成提交 - 这是更容易。“ ...遗憾的是我不能这样做:因为我的后端是Google AppEngine [Java]并且InetAddress
类受到限制,我无法进行任意IP查找。
答案 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地址。