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

Php 如何确定用户IP地址是否在可访问范围内?,php,ip,Php,Ip,我正在获取用户IP地址,然后我想确定该IP地址是否在可访问范围内 我正在做的是,在我的PHP脚本中,我正在使用函数,并将其与允许的ip地址范围进行比较 我知道这不是一个干净的方法…有没有人有更好的办法 谢谢你的帮助 谢谢, Amit至少,您需要将前N位与已知的专用或已知的未使用网络块进行比较。最小的是 这个表示法意味着如果你屏蔽掉前8位,得到10位,它就在第一个私有块中。12位==172.16是第二位,以此类推 您可以检测到更多的块 最简单的例子是127/8,它们都是。您可能知道127.0.0.

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

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

我知道这不是一个干净的方法…有没有人有更好的办法

谢谢你的帮助

谢谢,
Amit

至少,您需要将前N位与已知的专用或已知的未使用网络块进行比较。最小的是

这个表示法意味着如果你屏蔽掉前8位,得到10位,它就在第一个私有块中。12位==172.16是第二位,以此类推

您可以检测到更多的块

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

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

另一组您可能希望忽略的地址是不同的范围。您应该只向这些连接发送UDP数据包,而不是TCP连接


如果你想变得更具攻击性,你可以随时更新发布的最新任务,忽略尚未分配的块中的IP。不过,您希望经常更新该列表。

至少需要将前N位与已知的专用或已知的未使用网络块进行比较。最小的是

这个表示法意味着如果你屏蔽掉前8位,得到10位,它就在第一个私有块中。12位==172.16是第二位,以此类推

您可以检测到更多的块

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

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

另一组您可能希望忽略的地址是不同的范围。您应该只向这些连接发送UDP数据包,而不是TCP连接


如果你想变得更具攻击性,你可以随时更新发布的最新任务,忽略尚未分配的块中的IP。不过,您希望经常更新该列表。

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

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