第七星尘

php根据ip段以及子网掩码,判断某ip是否处于某子网下

为了检测客户端ip是否位于指定的网络里(如防火墙过滤有时候需要用到这个技术),我们需要知道三个参数:
1、客户端ip,假设符号是D
2、该网络下的ip地址段,假设符号是N
3、该网络下的子网掩码,假设符号是M
那么,如果客户端ip处于该网络下,应该会满足:
N==(D&M)
文字解释就是,用客户端ip和子网掩码进行与操作,所得结果应该与该网络下的ip段相等。不过注意一个问题,上面的公式,是用二进制进行计算的,并不是我们常见的点分十进制的ip地址。也就是说,我们获得客户端ip后,应该把它转换为32位二进制数字再进行计算。
好,明白原理,我就直接贴代码了。
<?php
//ip段以及子网掩码
$ip_ary=array(
"10.34.160.0"=>"255.255.255.0",//地址段=>地址掩码(子网掩码)
"202.216.12.0"=>"255.255.250.0",
"222.250.28.0"=>"255.255.255.0",
);

$client_ip=$_SERVER[‘REMOTE_ADDR’];//客户端ip

$D=ip_binay($client_ip);
$is_ip_in=0;
foreach($ip_ary as $k=>$value)
{
$M=ip_binay($value);
$temp=$D&$M;
$N=ip_binay($k);
if($temp==$N)$is_ip_in=1;
}

if($is_ip_in)echo "你的ip处于该网络下!";

//函数,把ip地址转换为二进制
function ip_binay($ip)
{
$ip_array = explode(".",$ip);
$t = ”;
foreach($ip_array as $v)
{
$tmp = decbin($v);
$tmp_len = strlen(decbin($v));
if($tmp_len < 8)
$t .= str_repeat( "0",(8 – $tmp_len) ).$tmp;
else
$t .= $tmp;
}
return $t;
}
?>
分享到: 更多
码字很辛苦,转载请注明来自第七星尘的技术博客《php根据ip段以及子网掩码,判断某ip是否处于某子网下》

评论

  1. 电热水龙头 #1

    代码大概的意思还是看懂的·呵呵

    回复
    2012-06-11