查看: 769|回复: 0

[系统安全] 获取CDN后端的真实IP地址

[复制链接]
yun 黑帽联盟官方人员 

920

主题

35

听众

1362

积分

超级版主

Rank: 8Rank: 8

  • TA的每日心情
    奋斗
    2019-10-18 11:20
  • 签到天数: 678 天

    [LV.9]以坛为家II

    |显示全部楼层
    一般如果我们网站没有加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;
    您需要登录后才可以回帖 登录 | 会员注册

    站长推荐上一条 /1 下一条