一 上代码
config.PHP
- //ip 白名单配置
- 'ipWlist'=>[
- 'ifFilter'=>true, // 是否开启白名单功能
- 'wlist'=>[
- '10.0.0.19',
- ],
- 'warea1'=>'10.8.0.0/16', // 白名单网段 1
- 'warea2'=>'10.12.0.0/16', // 白名单网段 1
- ],
commonfunc.PHP
private function checkIp(){ $user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"]; $user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"]; $ipC=config('appconf.ipWlist'); if(!$ipC['ifFilter']){ return true; } if(in_array($user_IP, $ipC['wlist'])){ return true; } if( ! $this->ip_in_network($user_IP, $ipC['warea1'])){ if( ! $this->ip_in_network($user_IP, $ipC['warea2'])){ return false; } } return true; } private 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; }
二 说明
2.1 获取 ip 的方式
$_SERVER["HTTP_VIA"]
有代理服务器的时候, 表示代理服务器 IP;
$_SERVER["HTTP_X_FORWARDED_FOR"] 透过代理服务器取得客户端的真实 IP 地址;
$_SERVER["REMOTE_ADDR"] 正在浏览当前页面用户的 IP 地址
一般来说, 开发者对于内部的服务器架构比较了解, 简单粗暴的用
REMOTE_ADDR
即可, 因为
REMOTE_ADDR
不可伪造, 更加安全, 另外两个字段就没那么靠谱.
2.2 有的童鞋不是用数组的 config 而是用 define
可以用 json_encode, 序列化, eval() 等方式来解决, 如下
define("IPFILTER",1); define('IPWLISTJSON',json_encode(['127.0.0.1',])); // 业务中 $wlist = json_decode(IPWLISTJSON,1); define('IPWLIST',"return ['127.0.0.1',];"); // 业务中 $wlist=eval(IPWLIST) define('IPWLIST',serialize(['127.0.0.1',])); // 业务中 $wlist=unserialize(IPWLIST);
还可以用 string 特殊分隔符的 explode 形式等, 这里就不一一举例了
来源: http://www.bubuko.com/infodetail-3379809.html