黑帽联盟

标题: 获取CDN后端的真实IP地址 [打印本页]

作者: yun    时间: 2018-3-8 16:39
标题: 获取CDN后端的真实IP地址
一般如果我们网站没有加CDN的话,我们获取到的IP就是真实的IP,以下是获取IP的php代码:
  1. if ($_SERVER['REMOTE_ADDR']) {//判断SERVER里面有没有ip,因为用户访问的时候会自动给你网这里面存入一个ip
  2. $cip = $_SERVER['REMOTE_ADDR'];
  3. } elseif (getenv("REMOTE_ADDR")) {//如果没有去系统变量里面取一次 getenv()取系统变量的方法名字
  4. $cip = getenv("REMOTE_ADDR");
  5. } elseif (getenv("HTTP_CLIENT_IP")) {//如果还没有在去系统变量里取下客户端的ip
  6. $cip = getenv("HTTP_CLIENT_IP");
  7. } else {
  8. $cip = "unknown";
  9. }
  10. echo $cip;
复制代码
以上代码经过本人亲测,可行。

注:以上代码只能获取没有加CDN,用户访问的IP;但如果加了CDN的话,获取的是CDN的ip,不是用户的真实IP

问题来了,如果加了CDN的话,那么如何获取用户真实IP呢?
实现代码如下:
  1. /**
  2. * 获取用户真实 IP
  3. */
  4. function getIP()
  5. {
  6.     static $realip;
  7.     if (isset($_SERVER)){
  8.         if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
  9.             $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
  10.         } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
  11.             $realip = $_SERVER["HTTP_CLIENT_IP"];
  12.         } else {
  13.             $realip = $_SERVER["REMOTE_ADDR"];
  14.         }
  15.     } else {
  16.         if (getenv("HTTP_X_FORWARDED_FOR")){
  17.             $realip = getenv("HTTP_X_FORWARDED_FOR");
  18.         } else if (getenv("HTTP_CLIENT_IP")) {
  19.             $realip = getenv("HTTP_CLIENT_IP");
  20.         } else {
  21.             $realip = getenv("REMOTE_ADDR");
  22.         }
  23.     }
  24.     return $realip;
  25. }
复制代码
以上代码经过本人亲测,可行。即使加了CDN,通过以上代码也可以获取用户的真实IP


话题拓展:根据获取用户的真实IP之后,根据IP地址,获取用户所在地
实现代码:
  1. header("Content-type: text/html; charset=utf-8");

  2. function getCity($ip = '')//获取地区
  3. {
  4.     if($ip == ''){
  5.         $url = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json";//新浪借口获取访问者地区
  6.         $ip=json_decode(file_get_contents($url),true);
  7.         $data = $ip;
  8.     }else{
  9.         $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;//淘宝借口需要填写ip
  10.         $ip=json_decode(file_get_contents($url));  
  11.         if((string)$ip->code=='1'){
  12.            return false;
  13.         }
  14.         $data = (array)$ip->data;
  15.     }
  16.      
  17.     return $data;  
  18. }

  19. print_r($city);
复制代码
以上代码,本人亲测,可行。注意:淘宝接口有限制速度的。我们在使用淘宝接口获取地址的话,有时候会很慢,这个很正常

如果你觉得淘宝接口慢,可以把接口换成新浪的:$url="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=".$ip;





欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/) Powered by Discuz! X2.5