通过PHP检测具有代理服务器的客户端

通过PHP检测具有代理服务器的客户端,php,proxy,Php,Proxy,我正在寻找一种方法,或者一种方法来检测使用任何类型的代理服务器查看我的网站的客户端。我正在使用PHP/Apache。。。最好的方法是什么?需要检测任何代理服务器,而不是某个 编辑 我对匿名代理更感兴趣。。。因为通过查找HTTP\u X\u FORWARDED\u for可以很容易地检测到正常的 另一次编辑 试试这个: 1) 转到(或任何其他免费匿名代理站点) 2) 访问: 3) 它们能够以某种方式阻止,因为页面错误显示为“加载样式表时出错:加载XSLT样式表时发生网络错误:” 我想做一些类似的事

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

编辑

我对匿名代理更感兴趣。。。因为通过查找HTTP\u X\u FORWARDED\u for可以很容易地检测到正常的

另一次编辑

试试这个:

1) 转到(或任何其他免费匿名代理站点)

2) 访问:

3) 它们能够以某种方式阻止,因为页面错误显示为“加载样式表时出错:加载XSLT样式表时发生网络错误:”


我想做一些类似的事情来阻止代理。

除非它们传递特殊的标题,明确地提到它,比如X-Forwarded-For或其他什么,否则你无法检测到


据我所知,你必须使用黑名单。使用putty portforwarding、VPN或其他更复杂方法的用户是不可接触的,因为他们的行为与普通用户完全相同。

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


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

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

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

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

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


如果你有垃圾邮件或其他滥用流量的麻烦,那么仅仅阻止代理将不会有多大帮助。您应该寻找解决问题核心(垃圾邮件过滤器、ID)的具体解决方案,而不是假设anonymous=有罪。

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


在PHP中使用以下两种解决方案。 //方法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!");
         }
     }

老话题,但我可能已经想明白了

它在我的网站上是实时的,我认为它可能适用于大多数情况

我的问题是,被禁止的用户回到我的网站,并使用您可以找到的众多代理之一重新注册一个新的电子邮件地址。我在注册/登录表单上做了一个简单的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>

表格中需要的东西
$('login'u form').attr('action','real'u login'u form');

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

已付:
-它们专注于欺诈检测,并有一个子类用于代理检测。请注意,这现在被视为“遗留”服务。

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

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


这里还列出了一些免费选项。

我觉得回答一个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端口,这将不起作用,但我不明白普通人为什么会这样做。

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

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

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

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

  • 代理添加新闻键/值
  • 代理未发送所有原始密钥/值,因此缺少一些密钥/值
  • 代理发送完全相同的键/值,但顺序不同
  • 代理以相同的顺序发送完全相同的键/值
  • 第四种情况可能发生,但其他情况最常见。 因此,您只需使用服务器中的键/值创建一个数组(基于在没有代理的情况下运行脚本时的结果),并比较$\u服务器中的键/值。如果您没有完全相同的键/值(更少、更多或以其他顺序),则可以假定页面来自代理


    注意,我同意一些人的说法,在某些情况下,代理可以用在“法律”中。

    是的,有什么办法可以做到吗?有些东西不能缓存,或者不能转发?没有这样的技巧,作为服务器端开发人员,您无法看到我是通过VPN(是的,这是一个代理)还是通过我真正的internet连接进行连接。你提到的技巧
     <?php
     foreach ($_SERVER as $key => $val)
     {
         echo $key."<br>\n";  
     }
     ?>