我开发了一个PHP Web服务.我想记录使用此Web服务的WS客户端的所有传入连接.如何获取客户端的IP地址?的价值
$_SERVER['HTTP_CLIENT_IP']好像总是空着的.
这应该是你想要的:
$_SERVER['REMOTE_ADDR']
用户正在查看当前页面的IP地址.
http://php.net/manual/en/reserved.variables.server.php
实际上,我建议使用此功能来涵盖所有基础,例如使用代理,共享网络等的人:
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']; } }
确保不要信任从客户端发送的数据.$_SERVER['REMOTE_ADDR']
包含连接方的真实IP地址.这是您可以找到的最可靠的价值.
但是,它们可能位于代理服务器后面,在这种情况下代理可能已经设置了$_SERVER['HTTP_X_FORWARDED_FOR']
,但这个值很容易被欺骗.它可以由没有代理的人设置为用户想要的任何值,或者IP可以是来自代理后面的LAN的内部IP.
这意味着如果要保存$_SERVER['HTTP_X_FORWARDED_FOR']
,请确保也保存该$_SERVER['REMOTE_ADDR']
值,例如,将两个值保存在数据库的不同字段中.
如果要将IP保存为数据库作为字符串,请确保至少有45个字符的空间.IPv6将保留,并且这些地址大于旧的IPv4地址.
函数getUserIpAddr()和getRealIpAddr()不可靠!
唯一可靠的IP来自于$ip = $_SERVER["REMOTE_ADDR"];
其他任何人都可以通过发送CLIENT_IP标头伪造他的IP地址.
这个Firefox插件可以帮助您发送自定义标头.将CLIENT_IP = xxxx标头发送到运行此页面上任何功能的服务器,意味着客户可以选择他们想要的任何IP ...