ipbanned_model.class.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. defined('IN_PHPCMS') or exit('No permission resources.');
  3. pc_base::load_sys_class('model', '', 0);
  4. class ipbanned_model extends model {
  5. public $table_name = '';
  6. public function __construct() {
  7. $this->db_config = pc_base::load_config('database');
  8. $this->db_setting = 'default';
  9. $this->table_name = 'ipbanned';
  10. parent::__construct();
  11. }
  12. /**
  13. *
  14. * 把IP进行格式化,统一为IPV4, 参数:$op --操作类型 max 表示格式为该段的最大值,比如:192.168.1.* 格式化为:192.168.1.255 ,其它任意值表示格式化最小值: 192.168.1.1
  15. * @param $op 操作类型,值为(min,max)
  16. * @param $ip 要处理的IP段(127.0.0.*) 或者IP值 (127.0.0.5)
  17. */
  18. public function convert_ip($op,$ip){
  19. $arr_ip = explode(".",$ip);
  20. $arr_temp = array();
  21. $i = 0;
  22. $ip_val= $op== "max" ? "255":"1";
  23. foreach($arr_ip as $key => $val ){
  24. $i++;
  25. $val = $val== "*" ? $ip_val:$val;
  26. $arr_temp[]= $val;
  27. }
  28. for($i=4-$i;$i>0;$i--){
  29. $arr_temp[]=$ip_val;
  30. }
  31. $comma = "";
  32. foreach($arr_temp as $v){
  33. $result.= $comma.$v;
  34. $comma = ".";
  35. }
  36. return $result;
  37. }
  38. /**
  39. *
  40. * 判断IP是否被限并返回
  41. * @param $ip 当前IP
  42. * @param $ip_from 开始IP段
  43. * @param $ip_to 结束IP段
  44. */
  45. public function ipforbidden($ip,$ip_from,$ip_to){
  46. $from = strcmp($ip,$ip_from);
  47. $to = strcmp($ip,$ip_to);
  48. if($from >=0 && $to <= 0){
  49. return 0;
  50. } else {
  51. return 1;
  52. }
  53. }
  54. /**
  55. *
  56. * IP禁止判断接口,供外部调用 ...
  57. */
  58. public function check_ip(){
  59. $ip_array = array();
  60. //当前IP
  61. $ip = ip();
  62. //加载IP禁止缓存
  63. $ipbanned_cache = getcache('ipbanned','commons');
  64. if(!empty($ipbanned_cache)) {
  65. foreach($ipbanned_cache as $data){
  66. $ip_array[$data['ip']] = $data['ip'];
  67. //是否是IP段
  68. if(strpos($data['ip'],'*')){
  69. $ip_min = $this->convert_ip("min",$data['ip']);
  70. $ip_max = $this->convert_ip("max",$data['ip']);
  71. $result = $this->ipforbidden($ip,$ip_min,$ip_max);
  72. if($result==0 && $data['expires']>SYS_TIME){
  73. //被封
  74. showmessage('你在IP禁止段内,所以禁止你访问');
  75. }
  76. } else {
  77. //不是IP段,用绝对匹配
  78. if($ip==$data['ip']&& $data['expires']>SYS_TIME){
  79. showmessage('IP地址绝对匹配,禁止你访问');
  80. }
  81. }
  82. }
  83. }
  84. }
  85. }
  86. ?>