如何确定用户IP地址是否在可访问范围内?

时间:2009-10-02 03:10:13

标签: php ip

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

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

我知道这不是一个干净的方法吗?有人有更好的想法吗?

任何帮助表示感谢。

谢谢, 阿米特

2 个答案:

答案 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);
}