我正在尝试检查IP地址是否是仅内部(即私有)IP,但我得到了一个奇怪的结果:
filter_var('173.194.66.94', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // returns 173.194.66.94
filter_var('192.168.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // returns false
filter_var('127.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // returns 127.0.0.1?
Run Code Online (Sandbox Code Playgroud)
当然127.0.0.1算作私有IP?我发现2010年的这个错误报告将此报告为一个问题,但它被标记为已修复.这是回归,还是我误解了这个过滤器的作用?我使用的是PHP 5.4.6.
我想那是因为127.0.0.1是不是真的一个privateIP范围,但loopbackIP范围,如解释在这里
通常,当TCP/IP应用程序想要发送信息时,该信息沿着协议层传播到IP,在IP中将其封装在IP数据报中.然后,该数据报传递到设备物理网络的数据链路层,以便在到达IP目的地的途中传输到下一跳.
但是,为回送功能留出了一个特殊的地址范围.这是127.0.0.0到127.255.255.255的范围.主机发送到127.xxx环回地址的IP数据报不会传递到数据链路层进行传输.相反,它们在IP级别"回送"到源设备.实质上,这代表了正常协议栈的"短路"; 数据由设备的第三层IP实现发送,然后立即由它接收.
环回范围的目的是测试主机上的TCP/IP协议实现.由于较低层是短路的,因此发送到环回地址允许有效地测试较高层(IP和以上),而不会在较低层出现问题.127.0.0.1是最常用于测试目的的地址.
Filter标志手册对此特定问题进行了评论.
<?php
function FILTER_FLAG_NO_LOOPBACK_RANGE($value) {
// Fails validation for the following loopback IPv4 range: 127.0.0.0/8
// This flag does not apply to IPv6 addresses
return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ? $value :
(((ip2long($value) & 0xff000000) == 0x7f000000) ? FALSE : $value);
}
$var = filter_var('127.0.0.1', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns FALSE
$var = filter_var('74.125.19.103', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns '74.125.19.103'
// To filter Private IP ranges and Loopback ranges
$var = filter_var('127.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE) && filter_var('127.0.0.1', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns FALSE
?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3665 次 |
| 最近记录: |