如何在PHP Web服务中获取客户端的IP地址?

时间:2009-09-17 09:47:56

标签: php web-services logging ip-address

我开发了一个PHP Web服务。我想记录使用此Web服务的WS客户端的所有传入连接。如何获取客户端的IP地址?

$_SERVER['HTTP_CLIENT_IP']
的价值 好像总是空着的。

10 个答案:

答案 0 :(得分:51)

这应该是你想要的:

$_SERVER['REMOTE_ADDR']
  

用户所在的IP地址   查看当前页面。

http://php.net/manual/en/reserved.variables.server.php

答案 1 :(得分:24)

实际上,我建议使用此功能来涵盖所有基础,例如使用代理,共享网络等的人:

function getUserIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) //if from shared
    {
        return $_SERVER['HTTP_CLIENT_IP'];
    }
    else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //if from a proxy
    {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
        return $_SERVER['REMOTE_ADDR'];
    }
}

答案 2 :(得分:8)

确保不信任从客户端发送的数据。 $_SERVER['REMOTE_ADDR']包含连接方的真实IP地址。这是你能找到的最可靠的价值。

但是,它们可能位于代理服务器后面,在这种情况下代理可能已设置$_SERVER['HTTP_X_FORWARDED_FOR'],但此值很容易被欺骗。它可以由没有代理的人设置为用户想要的任何值,或者IP可以是来自代理后面的LAN的内部IP。

这意味着,如果您要保存$_SERVER['HTTP_X_FORWARDED_FOR'],请确保同时保存$_SERVER['REMOTE_ADDR']值,例如,将两个值保存在您的不同字段中数据库中。

如果要以字符串形式将IP保存到数据库,请确保至少有 45个字符的空间。 IPv6将保留,并且这些地址大于旧的IPv4地址。

答案 3 :(得分:5)

函数getUserIpAddr()和getRealIpAddr()不可靠

唯一可靠的IP来自$ip = $_SERVER["REMOTE_ADDR"]; 否则,任何人都可以通过发送CLIENT_IP标头伪造他的IP地址。

This Firefox Addon可以帮助您发送自定义标头。将CLIENT_IP = x.x.x.x标头发送到运行此页面上任何功能的服务器,意味着客户可以选择他们想要的任何IP ...

答案 4 :(得分:2)

您是否在为您的网络服务使用某种框架?我看到了一些框架(例如Agavi)故意删除所有$ SERVER数据,因为他们希望您使用框架服务中的验证值。

答案 5 :(得分:2)

如果这不能完成这项工作,我不知道是什么......

    function getClientIP() {
        if (isset($_SERVER)) {

           if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
               return $_SERVER["HTTP_X_FORWARDED_FOR"];

           if (isset($_SERVER["HTTP_CLIENT_IP"]))
               return $_SERVER["HTTP_CLIENT_IP"];

           return $_SERVER["REMOTE_ADDR"];
        }

        if (getenv('HTTP_X_FORWARDED_FOR'))
           return getenv('HTTP_X_FORWARDED_FOR');

        if (getenv('HTTP_CLIENT_IP'))
           return getenv('HTTP_CLIENT_IP');

    return getenv('REMOTE_ADDR');
}

答案 6 :(得分:1)

我的首选功能:

    public static function get_remote_ip() {
        if(isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR'])) {
            return $_SERVER['REMOTE_ADDR'];
        } 

        if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            return $_SERVER['HTTP_X_FORWARDED_FOR'];
        }

        return null;
    }

答案 7 :(得分:0)

您可以尝试

<?php
var_dump($_SERVER);

查看所有变量。但这实际上还取决于脚本运行的后端。那是Apache吗?

答案 8 :(得分:0)

<?php 
 $ip=$_SERVER['REMOTE_ADDR'];
 echo "Your IP Address is $ip"; 
 ?> 

并插入数据库只需使用$ ip

答案 9 :(得分:-1)

<?php
function getIP() {
$ip;
if (getenv("HTTP_CLIENT_IP"))
$ip = getenv("HTTP_CLIENT_IP");
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
else
$ip = "UNKNOWN";
return $ip;

}

//-----------------------------------------------

//Usage:


$client_ip=getIP();
echo "Your IP :".$client_ip;
?>