【问题标题】:Detecting whether a user is behind a proxy检测用户是否在代理后面
【发布时间】:2009-06-16 11:35:48
【问题描述】:

我正试图弄清楚如何检测登录我网站的人是否在代理后面。我读到您可以通过可嵌入对象(Flash 和 Java)检测一个人的真实 IP 地址。但是,我实际上无法找到任何示例或来源。

我正在使用 PHP,并且我读过寻找 $_SERVER['HTTP_X_FORWARDED_FOR'], $_SERVER['HTTP_CLIENT_IP'] 等会检测到大多数代理,但到目前为止我还无法通过 TOR 进行测试(也许 TOR 不会标记这些,但是我读过匿名代理仍然显示HTTP_X_FORWARDED)。如果可能的话,我想尝试使用 java servlet。谁能指出我正确的方向(最好是示例?)我在 hackers.org 上看到了一些代码,但它们只显示了客户端而不是服务器端。

【问题讨论】:

  • 如果我可以问:为什么要检测代理用户?除了它们的连接使用可能存在一些差异(网络足迹,如果你愿意的话)之外,这真的无关紧要。

标签: php http proxy


【解决方案1】:

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[] superglobal 中获取这些字段的值。

【讨论】:

  • 啊,好的。感谢您提供该列表和其他信息。
  • 如果您想检查客户端 IP 与 Tor 节点、公共代理、坏机器人的最新(并且您不想自己管理)列表,和垃圾邮件发送者,我建议看看我的服务:Ipregistry (ipregistry.co)。
【解决方案2】:

如果您想检查用户是否使用代理的天气,您可以进行端口扫描并在发出请求时检查标头。如果代理不透明,这些方法将显示公共 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服务器,为每个用户分配子域。

您还可以查看此站点proxy checker,即使您使用代理,它也会显示公共和私有 IP 地址。

【讨论】:

    【解决方案3】:

    Java Applet 或 Flash 都不应泄露客户端 IP。我知道旧版本的 Flash 存在一个安全漏洞,这使得它成为可能。很可能现在已经修补了。

    我从未使用过 TOR,但从我读到的内容看来,它似乎是作为一种 VPN 实现的,因此浏览器根本不会意识到它。

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

    【讨论】:

    • 哦,我注意到 Flash 9.0 之后 Flash 的问题发生了变化,所以你是对的。我想阻止人们在我制作的游戏中使用代理,所以当我禁止垃圾邮件发送者时,他们无法使用代理创建新帐户。我知道这不会是万无一失的,但我想让它变得更难一点。
    【解决方案4】:

    如果这是一个选项,您可以尝试使用 https。然后,您应该可以看到用户 IP。但是不知道 SSL 代理背后的办公室用户。

    【讨论】:

      【解决方案5】:

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

      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,但在测试中没有出现。
      • 哦,太好了。与我的标头复制的完全相同的答案,带有 HTTP_ 前缀被接受,而我的投反对票??
      【解决方案6】:

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

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

      其中89.187.143.81 必须替换为您的客户端 IP,tryout 必须替换为您的 API 密钥。

      在输出中,查看字段security -&gt; is_tor_exit。如果布尔值为真,那么您的客户端正在使用 Tor。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 2014-10-30
        • 2012-02-16
        相关资源
        最近更新 更多