PHP检测是否内网ip

  • 使用PHP自带filter_var函数
1
2
3
4
5
6
7
8
if (filter_var(
$_SERVER['REMOTE_ADDR'],
FILTER_VALIDATE_IP,
FILTER_FLAG_NO_PRIV_RANGE|FILTER_FLAG_NO_RES_RANGE
)) {
header('HTTP/1.0 403 Forbidden');
die('禁止外网访问');
}
  • 根据内网ip段的范围检测ip2long的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function ip_is_private($ip){
$pri_addrs = array(
'10.0.0.0|10.255.255.255',
'172.16.0.0|172.31.255.255',
192.168.0.0|192.168.255.255',
'169.254.0.0|169.254.255.255',
'127.0.0.0|127.255.255.255'
);
$long_ip = ip2long($ip);
if($long_ip != -1) {
foreach($pri_addrs AS $pri_addr) {
list($start, $end) = explode('|', $pri_addr);
// IF IS PRIVATE
if($long_ip >= ip2long($start) && $long_ip <= ip2long($end))
return (TRUE);
}
}
return (FALSE);
}
  • 使用位操作符>>进行判断
1
2
3
4
5
6
7
8
9
10
11
12
function ip_is_internal($ip) { 
$ip = ip2long($ip);
if (!$ip) {
return false;
}
$net_local = ip2long('127.255.255.255') >> 24; //127.x.x.x
$net_a = ip2long('10.255.255.255') >> 24; //A类网预留ip的网络地址
$net_b = ip2long('172.31.255.255') >> 20; //B类网预留ip的网络地址
$net_c = ip2long('192.168.255.255') >> 16; //C类网预留ip的网络地址
return $ip >> 24 === $net_local || $ip >> 24 === $net_a
|| $ip >> 20 === $net_b || $ip >> 16 === $net_c;
}