function GetIP(){
if (getenv(“HTTP_CLIENT_IP”) && strcasecmp(getenv(“HTTP_CLIENT_IP”), “unknown”))  //strcasecmp()中  getenv(“HTTP_CLIENT_IP”), 和"unknown"比较的返回值是正的还是负的?这两个字符串等长么?
$ip = getenv(“HTTP_CLIENT_IP”);
else if (getenv(“HTTP_X_FORWARDED_FOR”) && strcasecmp(getenv(“HTTP_X_FORWARDED_FOR”), “unknown”))
$ip = getenv(“HTTP_X_FORWARDED_FOR”);
else if (getenv(“REMOTE_ADDR”) && strcasecmp(getenv(“REMOTE_ADDR”), “unknown”))
$ip = getenv(“REMOTE_ADDR”);
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], “unknown”))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = “unknown”;
return($ip);
}
网上查到的最多的就是这段经典的代码,可是网上都没有什么注释,尤其是strcasecmp的用法,书上网上都不甚详细。一个ip地址和字符串“unknown”比较的值,好像应该是负的吧?strcasecmp是比较ASCII码的值,具体怎么比呢?所有字符的值相加,比较?数字的ASCII值好像比字符小。http://hi.baidu.com/lampcool/blog/item/029ca5f1eaf18ec10a46e0bf.html
参考这篇博文,这段代码还是不是很好理解。
求明白的高手给予提示!

解决方案 »

  1.   

    这个方法存在缺陷,还是老实点直接用$_SERVER['REMOTE_ADDR'];吧
      

  2.   

    这个问题我已经解答过了请参考http://topic.csdn.net/u/20110917/11/06fdda94-5cd7-4f8a-8760-a65dda095dbc.html
      

  3.   


    这样不能保证一定能取到ip地址。。我们做的取ip地址的代码都是lz那样的。感觉lz的代码有点问题。
    function GetIP()
    {
    if(!empty($_SERVER["HTTP_CLIENT_IP"]))
       $cip = $_SERVER["HTTP_CLIENT_IP"];
    else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
       $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if(!empty($_SERVER["REMOTE_ADDR"]))
       $cip = $_SERVER["REMOTE_ADDR"];
    else
       $cip = "unknown";
    return $cip;
    }
    ?>
    strcasecmp是忽略大小写的比较:am 和AM,Am的strcasecmp的结果都是true.
      

  4.   

    不管能不能取到,$_SERVER["HTTP_CLIENT_IP"]和$_SERVER["HTTP_X_FORWARDED_FOR"]都是可以伪造的。当然,$_SERVER["REMOTE_ADDR"]取得的可能是代理ip
      

  5.   

    ip可以伪造,在连接中的博文已经提到了。现在我主要困惑,觉得这段经典的代码好像有问题。主要是strcasecmp,当取到ip时,和“unknown”是怎么比较的,我随便写个192.168.0.1,和"unknown"比较好像结果是-67。"1" ASCII码是49,“u”是117,我也不知道这是怎么来的。要是取到ip,数字比"u"小,就一定判断是假了,那HTTP_X_FORWARDED_FOR取到的透明代理的用户地址也返不回来啊。我都糊涂了
      

  6.   

    首先解释一下 strcasecmp 的使用echo strcasecmp('A', 'a');// 0原型
    int strcasecmp ( string str1, string str2 )
    返回值 < 0 表示 str1小于str2
    返回值 > 0 表示 str1大于str2
    返回值 = 0 表示 str1等于str2if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
      $ip = getenv("HTTP_CLIENT_IP");$ip 被赋值的条件是:
    getenv("HTTP_CLIENT_IP") 不为空 和 getenv("HTTP_CLIENT_IP") 不等于 "unknown"其次,所有涉及到得服务器环境都是前人的经验总结,不必深究
      

  7.   

    #1.strcasecmp('192.168.0.1','unknown');结果应该是-68,就是ord('1') - ord('u')的结果,49 - 117 == 68
    要是取到ip,数字比"u"小,就一定判断是假了
    #2,strcasecmp返回只要不为0,都表示两个串不想等,对于if来说就是true,上面这段话是不是你理解错了?0->false,1->true,-1->true.
      

  8.   

    6楼,7楼说道我心坎了去啦。最近被迫被填鸭了很多中语言,C#,java,javascript,php我都混啦,总以为小于0就是false了。谢谢大家的耐心解答。