我读过很多文章,建议使用http_x_forwardd_for来获取代理服务器和客户端的真实ip地址,但似乎都不起作用。
我被分配了一个本地IP地址,我使用代理服务器连接到互联网。但当我显示整个$_SERVER变量时,并没有一个我使用的真实机器IP和代理服务器的踪迹
此链接显示整个$_SERVER变量。
我想这在PHP中是不可能的。我该如何做到这一点?我知道这是可能的,因为有一次我看到一些网页显示了我在Mozilla中使用的真实IP地址和代理服务器。但不确定它使用的是哪种语言。
我该如何完成?我已经准备好使用CGI或JavaScript了。我在网上找不到任何工作实例。帮助
是否发送http_x_forwarded_for
标头完全取决于代理。有些会,有些不会。无论您在打印$_SERVER
变量时使用哪个代理,都没有发送标头。
即使所有代理都发送了标头,您仍然会遇到问题,因为任何人都可以伪造http_x_forwarded_for
标头,因此如果您的脚本将其视为真正的IP,则有人可以伪造它来绕过您的IP检查。
如果使用$_SERVER['REMOTE_ADDR']
而忘记依赖http_x_forwarded_for
,则可以做到最好。是的,代理的用户可以使用新的IP访问您的网站,但这比所有用户在http_x_forwarded_for
中伪造IP的能力要好。
作为一种帮助,你可以维护一个已知代理的列表,但这最终不会给你真正的客户端IP,它只能告诉你IP是否在你的代理列表中。
我发现我写的这个小开关解决了大多数人的问题,他们很难获得真正的ip,而不是代理。它检查REMOTE_ADDR
和HTTP_X_FORWARDED_FOR
是否相同,如果相同,则打印REMOTE_ADDR
。如果它们不同,则假定HTTP_X_FORWARDED_FOR
是正确的,因为REMOTE_ADDR
通常返回代理。希望这能有所帮助。如果有更好的方法,请告诉我!kevin@tiger-tech.tk
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$ip2 = $_SERVER['HTTP_X_FORWARDED_FOR'];
switch($ip):
case $ip2:
$ipa = $_SERVER['REMOTE_ADDR'];
$city= file_get_contents ("http://ipinfo.io/".$_SERVER['REMOTE_ADDR']."/city");
$region= file_get_contents ("http://ipinfo.io/".$_SERVER['REMOTE_ADDR']."/region");
$geo= file_get_contents ("http://ipinfo.io/".$_SERVER['REMOTE_ADDR']."/geo");
break;
default:
$ipa = $_SERVER['HTTP_X_FORWARDED_FOR'];
$city= file_get_contents ("http://ipinfo.io/".$_SERVER['HTTP_X_FORWARDED_FOR']."/city");
$region= file_get_contents ("http://ipinfo.io/".$_SERVER['HTTP_X_FORWARDED_FOR']."/region");
$geo= file_get_contents ("http://ipinfo.io/".$_SERVER['HTTP_X_FORWARDED_FOR']."/geo");
break;
endswitch;
?>