即使他们使用像hidemyass.com这样的代理网站,我也想从用户那里获取真实的IP地址
这是我的代码,并认为它有效但我测试了它并没有
<?php
function getRealIpAddr()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
?>
我认为这段代码可行,但代理仍然绕过它。
提前致谢。
答案 0 :(得分:19)
如果代理不想告诉您(并且任何真正的匿名代理不会),则无法保证获得“真实”IP地址。
答案 1 :(得分:6)
你做不到。您拥有的信息来自apache / iis / whatever,它只知道谁与您的服务器通信,在这种情况下,它是代理服务器。除非代理想要在标题中发送该信息,否则你将无法获得它。
X-Forwarded-For是您可以做的最好的,但它不太可能是匿名代理发送的。
答案 2 :(得分:5)
除非您在编码IP地址的应用程序层实施某种身份验证协议( 受spoofin约束),否则无法获得“真正的”IP地址。< / p>
为什么会这样?
因为IP数据包可以由有权访问它的“中间人”任意重写。例如,代理,路由器,网关等
IP数据包具有此结构
| stuff | src ip | dst ip | stuff |
| .... | 32-bits| 32 bits | stuff |
所以src ip - 那些只是位,记住 - 可以被任意覆盖。
答案 3 :(得分:2)
除非代理将真正的IP地址放入标题中(常见 - 取决于代理使用的原因)(通常以某种形式的“X-something”),然后您只能看到代理的IP地址
答案 4 :(得分:0)
我在这里发现了一个类似的帖子来检查更多标题,看看用户是否正在使用可能有帮助的代理
答案 5 :(得分:0)
请试试这个
function get_IP_address()
{
foreach (array('HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'REMOTE_ADDR') as $key){
if (array_key_exists($key, $_SERVER) === true){
foreach (explode(',', $_SERVER[$key]) as $IPaddress){
$IPaddress = trim($IPaddress); // Just to be safe
if (filter_var($IPaddress,
FILTER_VALIDATE_IP,
FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)
!== false) {
return $IPaddress;
}
}
}
}
}