原因:可能被伪造ip

  1. /**
  2.  * 获取客户端IP地址
  3.  * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
  4.  * @return mixed
  5.  */
  6. function get_client_ip($type = 0) {
  7.     $type       =  $type ? 1 : 0;
  8.     static $ip  =   NULL;
  9.     if ($ip !== NULL) return $ip[$type];
  10.     if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  11.         $arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
  12.         $pos    =   array_search('unknown',$arr);
  13.         if(false !== $pos) unset($arr[$pos]);
  14.         $ip     =   trim($arr[0]);
  15.     }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
  16.         $ip     =   $_SERVER['HTTP_CLIENT_IP'];
  17.     }elseif (isset($_SERVER['REMOTE_ADDR'])) {
  18.         $ip     =   $_SERVER['REMOTE_ADDR'];
  19.     }
  20.     // IP地址合法验证
  21.     $long = sprintf("%u",ip2long($ip));
  22.     $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
  23.     return $ip[$type];
  24. }
复制代码

源代码如此,通过HTTP_X_FORWARDED_FOR可以获取到代理背后的真实IP,但是也有一个隐患,那就是用户可能通过伪造的头来改变HTTP_X_FORWARDED_FOR,而REMOTE_ADDR 是无法伪造的吧?
也就是说,用REMOTE_ADDR 虽然可能会有少部分用户通过切换代理IP来刷票,但是我觉得还是比HTTP_X_FORWARDED_FOR安全。
那怎么才能保证不被人恶意刷票呢?
将两种IP都获取到,另外设置个cookie,只要其中有一个重复或者cookie存在就无效,麻烦了些,不知道有没有更好的办法。

posted on 2016-10-11 12:49  飘渺的悠远  阅读(230)  评论(0编辑  收藏  举报