以下代码,用于取得客户端IP:
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $onlineip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $onlineip = $_SERVER['REMOTE_ADDR'];
}
但是以HTTP_开始的请求header均属于客户端可以伪造的信息,请问在反向代理环境下,如何保证PHP不会接收到伪造的无效的HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR值?

解决方案 »

  1.   

    反向代理和伪造IP有关系?IP是欺诈不了的,想欺诈你也肯定是用代理服务器来请求你,你能怎么办?
      

  2.   

    你要说不假造,还真的没有方法阻止。这东西,要看你要实现什么目的,达到什么程度?
    所以在实际应该中很多是结合mac地址来使用。搜索一下php 读mac类
      

  3.   

    在反向代理上直接取REMOTE_ADDR,把这个值设置成HTTP_X_FORWARDED_FOR传给后端。
      

  4.   


    <?php
    function get_real_ip(){
    $ip=false;
    if(!empty($_SERVER["HTTP_CLIENT_IP"])){
    $ip = $_SERVER["HTTP_CLIENT_IP"];
    }
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
    if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }
    for ($i = 0; $i < count($ips); $i++) {
    if (!eregi ("^(10|172.16|192.168).", $ips[$i])) {
    $ip = $ips[$i];
    break;
    }
    }
    }
    return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
    }echo get_real_ip();
    ?>
      

  5.   

    <?php
    function get_real_ip(){
    $ip=false;
    if(!empty($_SERVER["HTTP_CLIENT_IP"])){
    $ip = $_SERVER["HTTP_CLIENT_IP"];
    }
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
    if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }
    for ($i = 0; $i < count($ips); $i++) {
    if (!eregi ("^(10|172.16|192.168).", $ips[$i])) {
    $ip = $ips[$i];
    break;
    }
    }
    }
    return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
    }echo get_real_ip();
    ?>
      

  6.   

    人家用代理上或是vpn那个IP虽然不是他本人的,但是是代理真真切切的IP,就向买东西一样,让你店买东西的叫小王,他真叫小王,等小王走了,我告诉,小王是帮别人买的东西