2009-10-02 70 views
1

我抓取用户IP地址,然后我想确定该IP地址是否在可访问范围内。如何确定用户IP地址是否在可访问的范围内?

我正在做的是,在我的PHP脚本中,我使用'ip2long'函数并将其与允许的IP地址范围进行比较。

我知道这不是一个干净的方法来做到这一点...有没有人有更好的想法做到这一点?

任何帮助表示赞赏。

感谢, 阿米特

回答

3

至少,你需要对已知私人或已知未使用的网络模块进行比较排名靠前的N位。并且,最小的是RFC 1918 private networks:

10/8 
172.16/12 
192.168/16 

(此符号意味着如果你屏蔽掉了前8位,并获得“10”,它在第一专用块。12位== 172.16是第二,等等)

还有更多的块可以检测。

最简单的例子是127/8,它们都是loopback addresses。您大概知道127.0.0.1,但实际上所有127.x.y.z地址都是指您计算机上的回送接口。

一个比较晦涩的例子是5/8,它被分配但从未在广泛的互联网上使用过,所以它已被拨入Hamachi。但是,如果您的程序可能在可以访问Hamachi网络的计算机上运行,​​那么您会希望对此进行测试。

另一组您可能要忽略的地址是各种multicast范围。你只应该发送UDP数据包给那些,从来没有TCP连接。

如果您想要变得非常积极,您可以随时关注由IANA发布的最新作业,忽略尚未分配的块的IP。尽管如此,你仍然希望经常更新这个列表。

1

PHP做几乎一切都是为了你:

filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4| FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE); 

这将返回false,如果该IP是在私人或保留的范围,如果范围是可访问的,它会返回IP。你可以拿出这样的东西总是返回一个布尔值:

function isAccessibleRangeIP($ip) 
{ 
    return (bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4| FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE); 
} 
相关问题