php实现ip白名单黑名单功能


Posted in PHP onMarch 12, 2015

这个是一个检测ip是否非法的php函数,适应于白名单,黑名单功能开发,主要场景应用于:api来源限制,访问限制等.

/**

 * 安全IP检测,支持IP段检测

 * @param string $ip 要检测的IP

 * @param string|array $ips  白名单IP或者黑名单IP

 * @return boolean true 在白名单或者黑名单中,否则不在

 */

function is_safe_ip($ip="",$ips=""){ 

    if(!$ip) $ip = get_client_ip();  //获取客户端IP

    if($ips){

        if(is_string($ips)){ //ip用"," 例如白名单IP:192.168.1.13,123.23.23.44,193.134.*.*

            $ips = explode(",", $ips);

        }

    }else{ //读取后台配置 白名单IP

        $obj = new Setting();

        $ips = explode(",", $obj->getConfig("whiteip"));  

    }

    if(in_array($ip, $ips)){

        return true;

    }

    $ipregexp = implode('|', str_replace( array('*','.'), array('\d+','\.') ,$ips));  

    $rs = preg_match("/^(".$ipregexp.")$/", $ip);  

    if($rs) return true;

    return ;

}

获取ip地址,这里引用thinkphp内置函数

//应网友要求,贴出 get_client_ip() 函数

/**

 * 获取客户端IP地址

 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字

 * @param boolean $adv 是否进行高级模式获取(有可能被伪装) 

 * @return mixed

 */

function get_client_ip($type = 0,$adv=false) {

    $type       =  $type ? 1 : 0;

    static $ip  =   NULL;

    if ($ip !== NULL) return $ip[$type];

    if($adv){

        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {

            $arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);

            $pos    =   array_search('unknown',$arr);

            if(false !== $pos) unset($arr[$pos]);

            $ip     =   trim($arr[0]);

        }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {

            $ip     =   $_SERVER['HTTP_CLIENT_IP'];

        }elseif (isset($_SERVER['REMOTE_ADDR'])) {

            $ip     =   $_SERVER['REMOTE_ADDR'];

        }

    }elseif (isset($_SERVER['REMOTE_ADDR'])) {

        $ip     =   $_SERVER['REMOTE_ADDR'];

    }

    // IP地址合法验证

    $long = sprintf("%u",ip2long($ip));

    $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);

    return $ip[$type];

}

以上就是本文的全部内容了,希望对大家理解php检测IP有所帮助。

PHP 相关文章推荐
PHP编码规范-php coding standard
Mar 16 PHP
用mysql内存表来代替php session的类
Feb 01 PHP
php split汉字
Jun 05 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
PHP 引用文件技巧
Mar 02 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
Aug 09 PHP
PHP的pcntl多进程用法实例
Mar 19 PHP
php自定义错误处理用法实例
Mar 20 PHP
php使用NumberFormatter格式化货币的方法
Mar 21 PHP
php在apache环境下实现gzip配置方法
Apr 02 PHP
php使用正则表达式获取字符串中的URL
Dec 29 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 PHP
php操作(删除,提取,增加)zip文件方法详解
Mar 12 #PHP
PHP往XML中添加节点的方法
Mar 12 #PHP
PHP遍历XML文档所有节点的方法
Mar 12 #PHP
标准PHP的AES加密算法类
Mar 12 #PHP
php接口数据加密、解密、验证签名
Mar 12 #PHP
php查询相似度最高的字符串的方法
Mar 12 #PHP
PHP实现通用alert函数的方法
Mar 11 #PHP
You might like
Cakephp 执行主要流程
2010/03/24 PHP
php class类的用法详细总结
2013/10/17 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
2018/09/19 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
package.json各个属性说明详解
2020/03/11 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
python处理大数字的方法
2015/05/27 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
python基于ID3思想的决策树
2018/01/03 Python
python psutil库安装教程
2018/03/19 Python
详解python中的hashlib模块的使用
2019/04/22 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
一些Unix笔试题和面试题
2012/09/25 面试题
仓库保管员岗位职责
2013/12/20 职场文书
环保建议书作文500字
2015/09/14 职场文书
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL
yolov5返回坐标的方法实例
2022/03/17 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python