前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP中检测IP是否是内网IP的三个方法

PHP中检测IP是否是内网IP的三个方法

原创
作者头像
俗可耐
发布2018-07-28 17:52:00
3.7K0
发布2018-07-28 17:52:00
举报
文章被收录于专栏:俗人笔记

使用PHP自带filter_var函数

代码语言:txt
复制
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的值

代码语言:txt
复制
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);
}

使用位操作符>>进行判断

代码语言:txt
复制
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; 
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用PHP自带filter_var函数
  • 根据内网ip段的范围检测ip2long的值
  • 使用位操作符>>进行判断
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档