我读了很多文章,建议使用http_x_forwarded_for获取代理服务器和客户端的真实IP地址,但它们似乎都没有工作。
我被分配了一个本地IP地址,我使用代理服务器连接到互联网。但是当我显示整个$ _SERVER变量时,我没有使用我的Real Machine IP和代理服务器的一条跟踪。
此LINK显示整个$ _SERVER变量。
我想这在PHP中是不可能的。我该如何做到这一点?我知道这是可能的,因为一旦我看到一些网页显示我在Mozilla中使用的真实IP地址和代理服务器。但不确定它正在使用哪种语言。
我如何完成?我准备使用CGI或JavaScript。我在互联网上找不到任何有用的例子。帮助
答案 0 :(得分:1)
完全取决于代理是否会发送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是否在您的代理列表中。
答案 1 :(得分:1)
我发现我写的小开关解决了大多数人在获取真正的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;
?>