【问题标题】:Detect clients with Proxy Servers via PHP [duplicate]通过 PHP 检测具有代理服务器的客户端 [重复]
【发布时间】:2010-10-25 21:27:09
【问题描述】:

我正在寻找一种方法或方法来检测使用任何类型的代理服务器查看我的网站的客户端。我正在使用 PHP/Apache ... 最好的方法是什么?需要检测任何代理服务器,而不是具体的一个或另一个。

编辑

我对匿名代理更感兴趣...因为通过查找HTTP_X_FORWARDED_FOR 很容易检测到正常代理。

另一个编辑

试试这个:

1) 转到http://kproxy.com(或任何其他免费匿名代理网站)

2) 访问:http://www.worldofwarcraft.com

3) 他们能够以某种方式阻止,因为页面错误显示“加载样式表时出错:加载 XSLT 样式表时发生网络错误:http://kproxy.com/new-hp/layout/layout.xsl

我想做类似的事情来防止代理。

【问题讨论】:

  • 你有什么意图?是禁用缓存还是其他?
  • worldofwarcraft.com 通过 kproxy.com 加载对我来说很好,只是缺少样式表,这可能是由于它们在 html 中的引用方式而不是某些代理阻止程序。
  • 我们打算阻止匿名网站允许用户查看我们的网站。不知何故,如上所述,暴雪能够通过使用样式表技巧来做到这一点。
  • 奇怪,我用 firefox 加载不了。
  • 我建议使用 IPQualityScore (ipqualityscore.com),它每月可免费进行 5000 次查找,而且比简单的 HTTP_X_FORWARDED_FOR 检查要好得多。

标签: php proxy


【解决方案1】:

除非他们传递明确提及它的特殊标头,例如 X-Forwarded-For 或其他东西,否则您无法检测到这一点。

据我所知,您必须使用黑名单。使用 putty 端口转发、VPN 或其他更复杂方法的用户无法被发现,因为他们的行为与普通用户完全一样。

【讨论】:

  • 是的,有什么技巧可以做到吗?不能缓存或转发的东西?
  • 没有这样的技巧,作为服务器端开发人员,您无法看到我是通过 VPN 连接(是的,这是代理)还是通过我的真实互联网连接。您提到的技巧仅阻止某些基于 Web 的匿名代理,但不会阻止使用带有 putty 端口转发等的 VPS 的好方法。
【解决方案2】:

客户端传递给服务器的所有内容都可以自行配置。除了 IP 地址,您不能信任任何东西。因此,您无法检查标头数据,无论它是代理还是普通客户端。
顺便说一句:代理的目的是不显示自己是代理:)

当然,您可以获取请求者的 IP 地址并发送您将发送到代理的 http 请求。如果它有反应,它可能是一个代理,否则它是一个普通的客户端。这种方法将非常昂贵且不可靠。如果您的服务器请求的代理位于防火墙后面,您将得不到任何答复并认为它是普通客户端。

【讨论】:

  • 快速查看我在“另一个编辑”下编辑的示例。暴雪如何能够欺骗代理服务器。
【解决方案3】:

我认为这里发生的事情是一些客户端 JavaScript 正在尝试加载某些内容,并且可以“看到”页面正在框架内被查看。这可能是一个更有成效的探索途径——正如其他答案所表明的那样,代理故意使仅从服务器很难确定。

【讨论】:

    【解决方案4】:

    Metasploit 使用许多不同的技术来强制客户端的系统进行直接连接(Flash、Java、QuickTime、MS Office、自定义 DNS 服务器中的漏洞/错误功能)。

    或者,如果您无法让客户端的浏览器启动 metasploit,您可以尝试寻找开放代理(端口扫描)和known Tor exit nodes

    但请不要认为代理是邪恶的,需要被阻止——有很多合法的代理,有些用户必须使用它们。

    如果您在垃圾邮件或其他滥用流量方面遇到问题,那么仅仅阻止代理将无济于事。您应该寻找解决问题核心(垃圾邮件过滤器、IDS)的具体解决方案,而不是假设匿名 = 有罪。

    【讨论】:

      【解决方案5】:

      我正在使用以下内容,但我不确定它是否每次都有效。 这只是一个想法:)

      <?php
      $host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
      if ($host != $_SERVER['REMOTE_ADDR']) die('Proxy detected.');
      ?>
      

      【讨论】:

      • 这对许多用户来说会失败,因为 gethostaddr 大多数时候会返回用户名和提供者名称,例如:5ED042DD.dynamic..com
      【解决方案6】:

      在 PHP 中使用以下 2 个解决方案。 // 方法 1 = 快速,但不适用于匿名代理

          $proxy_headers = array(
              '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'
          );
          foreach($proxy_headers as $x){
              if (isset($_SERVER[$x])) die("You are using a proxy!");
          }
      

      // 方法 2 = 在使用的​​普通代理端口上端口扫描回源 IP。

          $ports = array(8080,80,81,1080,6588,8000,3128,553,554,4480);
          foreach($ports as $port) {
               if (@fsockopen($_SERVER['REMOTE_ADDR'], $port, $errno, $errstr, 30)) {
                    die("You are using a proxy!");
               }
           }
      

      【讨论】:

      • 我不鼓励使用第二种方法 - 它经常返回误报。在使用使用此方法的 3rd 方代理检测脚本时,我们的网站上遇到了此问题。
      • 第二种方法,不仅耗时长,无法在高流量网站上实施,而且还会对部分访问者进行杀毒提示!
      • HTTP_X_FORWARDED_FOR 使用我正常的 Internet 直接连接返回一个误报。
      • 这不起作用,它在我的普通浏览器中给出了积极的结果,并具有正常的互联网连接。
      【解决方案7】:

      老话题,但我可能已经想通了。

      它在我的网站上运行,我认为它可能适用于大多数情况。

      我的问题是被禁止的用户返回我的网站并使用您可以找到的众多代理之一使用新的电子邮件地址重新注册。我所做的是在注册/登录表单上进行简单的 jQuery 调用:

      <form id="login_form" method="post" action="/#fake_login_url">
         stuff you need for the form
      </form>
      <script>
         $('#login_form').attr('action','real_login_form');
      </script>
      

      【讨论】:

      • 我假设这只会检测从网络流量中剥离 JS 的代理?
      • 大多数代理会替换帖子的 URL,执行 JS 会使其恢复正常。确保real_login_form 不是纯文本,即:var url = 'ht'+'tp:'+'//'+'site'+'.com'+'/url'
      【解决方案8】:

      有多种付费/免费解决方案。他们中的大多数人会查看尝试连接的客户端 IP 以确定他们是否在代理上。

      付费:
      Maxmind - 他们专注于欺诈检测,并有一个代理检测子类别。请注意,这现在被视为“旧版”服务。

      免费:
      W I T C H - 能够通过查看唯一可识别的 MSS 值来检测 OpenVPN。代码在github上。

      GetIpIntel - 使用机器学习进行代理/VPN 检测,通过 API 进行查询。

      列出了更多免费选项on security stack exchange

      【讨论】:

      • 您可以在 Google 中搜索“IP2Proxy”。它也是每日更新代理 IP 地址的付费解决方案。
      • 我只是用 IP2Proxy 做了一些测试,它不是很准确。根据我的经验,blocked / maxmind 适用于付费解决方案,而 getIPIntel 是最好的免费解决方案。
      • 另一个值得添加到此列表的代理和 VPN 检测服务是 IPQualityScore (ipqualityscore.com)。他们有慷慨的免费和付费计划,代理检测非常准确,不会将 IP 标记为误报。
      • GetIpIntel 的速率限制非常低,而且价格很疯狂。我的应用程序在客户使用 2 小时后受到限制。
      【解决方案9】:

      我觉得回答一个 8 年前的帖子没用,但我还是会回答以供将来参考。
      我不知道代理,但大多数 VPN(如果你使用它们)会带来某种错误页面。如果你做了类似...

      $cont = file_get_contents($_SERVER["REMOTE_ADDR"]); //the users ip
      $errormsg = "nginx";
      if(strpos($cont, $errormsg)){
          die("No VPN's or Proxies Allowed");
      }
      

      这是非常基本的,你可以得到一个错误消息数组并这样做。
      如果用户转发了他们的 80 端口,这将不起作用,但我不明白为什么普通人会这样做。

      【讨论】:

        【解决方案10】:

        即使这是一个老问题,我也不得不检查代理,不幸的是,没有一个答案能给出好的结果。

        经过搜索,我找到了更好的方法。为了理解这种做法,只需使用以下代码创建一个小页面:

         <?php
         foreach ($_SERVER as $key => $val)
         {
             echo $key."<br>\n";  
         }
         ?>
        

        从您的服务器直接运行它。您将看到服务器发送的标头中的所有密钥。然后通过代理运行相同的脚本。 您将看到(取决于代理)3 个可能的结果:

        1. 代理添加新闻键/值
        2. 代理不会发送所有原始键/值,因此有些缺失。
        3. 代理发送完全相同的键/值,但顺序不同
        4. 代理以相同的顺序发送完全相同的键/值

        可能会发生第 4 种情况,但其他情况最常见。 因此,您只需使用服务器中的键/值创建一个数组(基于在没有代理的情况下运行脚本时的结果)并比较 $_SERVER 中的键/值。如果您没有完全相同的键/值(更少、更多或其他顺序),您可以假设页面来自代理。

        请注意,我同意在某些情况下代理可以在“合法”中使用的说法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-13
          • 1970-01-01
          • 2016-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          相关资源
          最近更新 更多