1

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

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

我知道这不是一个干净的方法......有没有人有更好的主意?

任何帮助表示赞赏。

谢谢,阿米特

4

2 回答 2

3

至少,您需要将前 N 位与已知私有或已知未使用的网络块进行比较。其中最少的是RFC 1918 专用网络:

10/8
172.16/12
192.168/16

(这个符号意味着如果你屏蔽掉前 8 位并得到“10”,它在第一个私有块中。12 位 == 172.16 是第二个,等等)

您可以检测到更多块。

最简单的例子是 127/8,它们都是环回地址。您可能知道 127.0.0.1,但实际上所有 127.xyz 地址都是指您机器上的环回接口。

一个更模糊的例子是 5/8,它被分配但从未在广泛的 Internet 上使用,所以它被Hamachi挪用了。但是,如果您的程序有可能在可以访问 Hamachi 网络的机器上运行,那么您在测试时要小心。

您可能想要忽略的另一组地址是各种多播范围。您应该只向那些发送 UDP 数据包,而不是 TCP 连接。

如果您想变得更加积极,您可以及时了解IANA发布的最新分配,忽略尚未分配的块中的 IP。不过,您希望经常更新该列表。

于 2009-10-02T03:21:53.797 回答
1

PHP does almost everything for you:

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

This will return false if the IP is in a private or reserved range, if the range is accessible it'll return the IP. You can come up with something like this to always return a boolean:

function isAccessibleRangeIP($ip)
{
    return (bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4| FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
}
于 2010-04-23T17:38:31.777 回答