我抓取用户IP地址,然后我想确定该IP地址是否在可访问范围内。
我正在做的是,在我的PHP脚本中,我使用'ip2long'函数并将其与允许的ip地址范围进行比较。
我知道这不是一个干净的方法吗?有人有更好的想法吗?
任何帮助表示感谢。
谢谢, 阿米特
答案 0 :(得分: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 :(得分:1)
PHP几乎为您做了一切:
filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4| FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
如果IP处于私有或保留范围内,则返回false,如果范围可访问,则返回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);
}