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

时间:2009-05-13 14:40:06

标签: php proxy

我正在寻找一种方法,或使用任何类型的代理服务器查看我的网站来检测客户端的方法。我正在使用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

我想做类似的事情以阻止代理。

11 个答案:

答案 0 :(得分:24)

在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 = portscan返回到使用的普通代理端口的原始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!");
         }
     }

答案 1 :(得分:17)

你无法检测到它,除非它们传递特殊的标题,明确地提到它像X-Forwarded-For或其他东西。

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

答案 2 :(得分:8)

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

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

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

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

答案 3 :(得分:3)

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

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

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

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

列出了一些免费选项on security stack exchange

答案 4 :(得分:1)

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

当然,您可以获取请求者的IP地址并发送您要发送给代理的http请求。如果它做出反应,它可能是一个代理,否则,它是一个普通的客户。这种方法非常昂贵且不可靠。如果您的服务器请求的代理服务器位于防火墙后面,那么您将无法接听并认为它是普通客户端。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

老话题,但我可能已经想出了什么。

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

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

答案 7 :(得分:1)

此网站显示此错误,因为它在源代码中有一个指向“new-hp / layout / layout.xsl”的地址。代理想隐藏你的ip,所以它将它改为http://kproxy.com/new-hp/layout/layout.xsl,指向他们的服务器,但文件实际上并不存在,所以Flash插件找不到它。

答案 8 :(得分:0)

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

搜索后,我发现了一个更好的方法。为了理解这种方式,只需使用以下代码创建一个小页面:

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

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

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

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

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

答案 9 :(得分:-1)

我觉得回答一个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 :(得分:-4)

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

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