PHP中多IP段权限控制方案
在某些项目中我们可能会用到根据IP段进行权限校验,比如不在我们配置的IP段内的用户访问某些页面或功能模块时,将提示其权限不够并禁止访问该页面的内容。鉴于项目中需求各异,下面只说下大致思路以及我个人的实现方式:
1. 在一个功能模块设计之初,我们应该让它尽可能易于配置,易于使用,易于应用到更多场景中,这里我们采用配置和校验函数分离的方式,将权限校验的代码都写在一个依赖配置数组能独立运行的函数中。
2. 我的思路是多IP段校验过程中,如果被校验的IP不在配置项的所有IP段中,则返回false, 禁止访问,如果被校验的IP在配置项的任意一项中,则终止校验,返回true,允许访问。
3. 我们在每一个IP段的校验中,依次对这一个IP段的四个部分进行校验,如果第一部分正确,则继续校验第二部分,如果遇到校验不通过的部分,则中止这个IP段的校验,进入下一个IP段的校验,如果这一个IP段的四部分校验都通过,则该IP段的校验通过,不再对接下来的其他IP段进行校验,返回true,允许访问。
有点绕?没事,话不重要,看代码:
1 <?php 2 function IpAuth($ip, $config){ 3 $ipArr = explode(".", $ip); 4 for ( $i=0; $i<count($config); $i++ ){ 5 $ips = explode(".", $config[$i]['start']); 6 $ipe = explode(".", $config[$i]['end']); 7 for( $j=0; $j<4; $j++ ){ 8 if( $ips[$j]==$ipArr[$j] || $ipArr[$j]==$ipe[$j] ){ 9 if($j == 3){ 10 return true; 11 }else{ 12 continue; 13 } 14 }else if( $ips[$j]<$ipArr[$j] && $ipArr[$j]<$ipe[$j] ){ 15 return true; 16 }else{ 17 continue 2; 18 } 19 } 20 } 21 return false; 22 } 23 ?>
4. 配置文件示例如下:
1 <?php 2 $ip_config = array( 3 array("start" => '120.11.11.11', "end" => '120.255.255.255'), 4 array("start" => '127.0.0.1', "end" => '127.0.255.255') 5 ); 6 7 ?>
5. php获取访问者IP字段方法:
1 $ip = $_SERVER['REMOTE_ADDR'];
6. 调用方式:
1 $result = IpAuth($ip, $ip_config);
返回true为校验通过,返回false为校验不通过