PHP 判断指定IP,是否在一个IP段里



先把 IP段的 IP转二进制     (192.168.1.1)
子网掩码 转为二进制          (24)

IP段的二进制   和    子网掩码二进制  按位与   (PHP 位与符号    &)  
得到结果保存起来;

把要查询的IP地址  转二进制   然后和  上面的 子网掩码二进制  按位与
 
得到的结果 和 上面  位与结果 对比,如果相同 就是 IP在此IP段内。


//$ip   要查询的IP地址
//$network  IP 段  例: 192.168.1.1/24
 
function ip_in_network2($ip, $network){
    $s = explode('/', $network);
    $iper = decbin(ip2long($s['0']));

    $maskBin = mask2binary($s['1']);
    $ipnet = ($iper & $maskBin);

    $cip = decbin(ip2long($ip));
    $cipnet = ($cip & $maskBin);

    if($ipnet == $cipnet){
        return true;
    }else{
        return false;
    }
}
//两位数 子网掩码 转 二进制
function mask2binary($mask){
    if ($mask > 32) {
        $this->error('错误的子网掩码!');
    }
    $str = array();
    for ($i=0; $i < $mask; $i++) {
        $str['0']  .= '1';
    }
    $we = 32-$mask;

    $str2 = array();
    for ($i=0; $i < $we; $i++) {
        $str2['0']  .= '0';
    }
    $bin = $str['0'].$str2['0'];
    return ($bin);
   
}

这是网上转载的,也可以使用。

####################################################

别人写的方法:
/*
    判断指定IP 是否在一个IP段里
    $ip     指定IP
    $net    IP段  例:192.168.1.255/24
*/
function ip_in_network($ip, $network)
{
    $ip = (double) (sprintf("%u", ip2long($ip)));
    $s = explode('/', $network);
    $network_start = (double) (sprintf("%u", ip2long($s[0])));
    $network_len = pow(2, 32 - $s[1]);
    $network_end = $network_start + $network_len - 1;
 
    if ($ip >= $network_start && $ip <= $network_end)
    {
        return true;
    }
    return false;
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这里提供一种简单的算法来判断用户IP是否为频率相同,次数频繁,疑似爬虫程序爬网站数据。我们可以通过记录用户请求的时间戳和请求次数来判断用户行为是否正常。如果用户在短时间内多次请求相同的接口,那么很可能是爬虫程序在工作。 下面是一个使用 PHP 实现爬虫检测的函数: ```php function is_crawler($ip) { $time_window = 60; // 时间窗口,单位为秒 $limit = 20; // 时间窗口内最大请求数 // 获取用户最近一时间内的请求记录 $requests = get_recent_requests($ip, $time_window); // 如果请求数超过限制,则判断为爬虫 return count($requests) >= $limit; } function get_recent_requests($ip, $time_window) { // 获取指定时间窗口内的请求记录 $requests = array(); $log_file = 'request_log.txt'; // 请求记录文件 $log_content = file_get_contents($log_file); $lines = explode("\n", $log_content); foreach ($lines as $line) { $fields = explode("\t", $line); if (count($fields) == 3 && $fields[0] == $ip) { $timestamp = intval($fields[1]); $diff = time() - $timestamp; if ($diff <= $time_window) { $requests[] = $timestamp; } } } return $requests; } ``` 其中 `$ip` 是用户的 IP 地址,`$time_window` 是时间窗口的长度,单位为秒。函数首先调用 `get_recent_requests` 函数获取用户最近一时间内的请求记录,然后判断是否超过了请求次数的限制。如果超过了限制,则判断为爬虫程序在工作。 请注意,这只是一种简单的算法,无法完全防止爬虫程序的攻击。如果您的网站需要更高的安全性,请考虑使用更复杂的算法或者使用专业的爬虫检测工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值