检测用户是否使用代理服务器

4
我正在尝试找出如何检测登录到我的网站的人是否在代理后面。我已经阅读过可以通过可嵌入对象(Flash和Java)检测一个人的真实IP地址。但是,我还没有能够找到任何示例或源代码。
我正在使用PHP,并且我已经阅读过查找$_SERVER['HTTP_X_FORWARDED_FOR'],$_SERVER['HTTP_CLIENT_IP']等内容可以检测大多数代理,但是到目前为止,我无法通过使用TOR进行测试来检测(也许TOR不会标记这些,但我已经阅读过匿名代理仍然显示HTTP_X_FORWARDED)。如果可能的话,我想尝试使用Java Servlet来完成。有人能指点我正确的方向吗(最好带有示例)?我在ha.ckers.org上看到了一些代码,但他们只展示了客户端而没有展示服务器端。

如果我可以问:你为什么想要检测代理用户?除了他们的连接使用可能存在一些差异(如果您愿意,可以称之为网络足迹),这实际上并不重要。 - benc
6个回答

4

TOR不提供任何服务器头,如X_FORWARDED_FOR,因此您最好使用所有已知的出口节点列表。可以在https://torstat.xenobite.eu/找到该列表。

对于其他代理,您可以查看服务器标头。感兴趣的可能的服务器标头包括:

HTTP_VIA 
HTTP_X_FORWARDED_FOR
HTTP_FORWARDED_FOR 
HTTP_X_FORWARDED
HTTP_FORWARDED 
HTTP_CLIENT_IP
HTTP_FORWARDED_FOR_IP 
VIA
X_FORWARDED_FOR 
FORWARDED_FOR
X_FORWARDED FORWARDED
CLIENT_IP
FORWARDED_FOR_IP
HTTP_PROXY_CONNECTION

在PHP中,您可以在$_SERVER[]超全局变量中获取这些字段的值。

啊,好的。谢谢你提供的列表和其他信息。 - ravun
如果您想检查客户端IP地址是否与最新的Tor节点、公共代理、恶意机器人和垃圾邮件发送者列表匹配(而且您不想自己管理),我建议您查看我的服务:Ipregistry(https://ipregistry.co)。 - Laurent

3

如果您想检查用户是否使用代理,可以进行端口扫描并在请求时检查标头。这些方法将揭示公共IP地址(顺便说一下,有两种类型的IP地址:公共IP地址和私有IP地址),如果代理不透明。但如果是透明代理,这种方法将无效。

function detectProxy() {
  $sockport = false;

     $proxyports=array(80,8080,6588,8000,3128,3127,3124,1080,553,554);
 for ($i = 0; $i <= count($proxyports); $i++) {
 if(@fsockopen($ipaddress,$proxyports[$i],$errstr,$errno,0.5)){
 $sockport=true;
 }
 }

 if(
     isset($_SERVER['HTTP_VIA'])
     || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
     || isset($_SERVER['HTTP_FORWARDED_FOR'])
     || isset($_SERVER['HTTP_X_FORWARDED'])
     || isset($_SERVER['HTTP_FORWARDED'])
     || isset($_SERVER['HTTP_CLIENT_IP'])
     || isset($_SERVER['HTTP_FORWARDED_FOR_IP'])
     || isset($_SERVER['VIA'])
     || isset($_SERVER['X_FORWARDED_FOR'])
     || isset($_SERVER['FORWARDED_FOR'])
     || isset($_SERVER['X_FORWARDED'])
     || isset($_SERVER['FORWARDED'])
     || isset($_SERVER['CLIENT_IP'])
     || isset($_SERVER['FORWARDED_FOR_IP'])
     || isset($_SERVER['HTTP_PROXY_CONNECTION'])
     || $sockport === true
 ) {
     echo 'User is using proxy';
 }
 else{
     echo ''user is not using proxy';
  }
 }

第二种方法是通过为每个用户分配子域名来使用DNS服务器。
您还可以检查此站点,代理检查器,即使您使用代理,它也将显示公共和私有IP地址。

2

Java Applets和Flash都不应泄漏客户端IP。我知道早期版本的Flash存在安全漏洞,可能现在已经修复了。

我从未使用过TOR,但根据我所读到的,它似乎被实现为一种VPN,因此浏览器将完全不知道。

为什么你需要知道用户是否在代理后面?


哦,我注意到Flash的问题在Flash 9.0之后发生了变化,所以你是对的。我想防止人们在我制作的游戏中使用代理,这样当我封禁垃圾邮件发送者时,他们就无法使用代理创建新账户。我知道这不是绝对可靠的,但我只是想让它变得更加困难一些。 - ravun

1

通过查找以下标头字段,您应该能够找到一些代理。

VIA
FORWARDED
USERAGENT_VIA
X_FORWARDED_FOR
PROXY_CONNECTION
XPROXY_CONNECTION
HTTP_PC_REMOTE_ADDR
HTTP_CLIENT_IP

关于阻止TOR,最好的方法是使用iptables阻止TOR出口节点。

如果你真的想要确定,你可以尝试一些“半恶意”的事情,比如在你的页面中嵌入一些flash或java,它会将真实客户端IP发送回给你。但这只有限定的范围,因为如果他在例如局域网中,你只能得到本地IP,例如192.168.1.x


我听说过这些头文件,但是在PHP中尝试从$_SERVER超全局访问它们似乎没有帮助。我还没有在$_SERVER超全局中看到这些索引,但我只使用了TOR,也许那是不同的。据我所知,TOR是一个匿名代理,仍然应该标记X_FORWARDED_FOR,但在测试中没有显示出来。 - ravun
1
哦,太好了。使用HTTP_前缀复制我的标头得到了接受,而我的却被投了反对票? - jitter

1

如果可以的话,您可以尝试使用https。然后用户IP应该对您可见。但是不确定SSL代理后面的办公室用户是否可见。


-1

一旦您获得了客户端IP地址,最简单的方法是将其传递给维护最新TOR出口节点列表的服务。例如,您可以使用Ipregistry(免责声明:我运营该服务):

https://api.ipregistry.co/89.187.143.81?key=tryout

在代码中,将 89.187.143.81 替换为您的客户端 IP,将 tryout 替换为您的 API 密钥。

在输出结果中,查看字段 security -> is_tor_exit。如果布尔值为 true,则表示您的客户端正在使用 Tor。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接