黑帽联盟

 找回密码
 会员注册
查看: 2864|回复: 0
打印 上一主题 下一主题

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

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

920

主题

37

听众

1364

积分

超级版主

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、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部