如何检测或阻止代理浏览

时间:2015-09-08 13:35:51

标签: php html apache proxy server

我建立了一个网站,我想限制我的网站中的代理浏览。我有搜索和谷歌这个问题,但我没有得到适当的方式这样做, 有没有办法检测/阻止代理浏览?

3 个答案:

答案 0 :(得分:3)

您为什么要尝试阻止代理?
通常,服务器/网站所有者会尝试阻止代理,以防止其成员在服务器/网站上进行恶意攻击时绕过IP禁止或隐藏其身份。虽然我可以理解其背后的原因,但检测代理服务器会带来比解决更多的麻烦。

检测代理的缺点

  1. 检测方法越好,服务器就越慢。
  2. 这绝不是百分之百的傻瓜证明!无论您尝试什么,都无法检测并阻止所有这些。
  3. 有一些选择的人有合法的理由使用代理。来自中国的人,例如他们的政府阻止了很多网站。
  4. 那我该怎么做呢?
    有更好,更安全的方法来保护您的服务器/网站。有许多人可以将它们全部命名,但其中有几个是:

    • 正则表达式 - 控制用户输入。
    • 安全文件上传/下载 - 有关详细信息,请参阅this PDF文件。
    • 通过短信等方式激活帐户 - 取消IP禁止,阻止电话号码。

    改善代理检测的一些方法

    标头检测(对匿名代理不起作用):

    $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!") };
    }
    

    激进的端口扫描检测(不推荐!!!): *

    $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!");
        }
    }
    

    *此方法会大大减慢您的服务器速度。它还会产生很多误报,它可能会触发你的访客病毒扫描器/防火墙。

    其他检测方法包括Detect and Block TOR exit nodes,并使用Google可以找到的许多公共代理列表。请始终牢记,使用这些方法会使服务器成倍减速!这就是我建议使用不同方法保护您的服务器/网站的原因。

答案 1 :(得分:2)

代理检测非常复杂,因为主机可以在几秒钟内成为代理。大多数代理服务器都会隐藏它们作为代理的事实,因此检查HTTP头是不够的。通过API提供付费和免费解决方案(集成和使用非常简单)。我在另一个帖子中谈过它们,但我也会在这里重新讨论一些来源。

付费:
MaxMind - 通过API检测代理,$ 5/1000查询。作为GeoIP数据库及其欺诈检查系统中最着名的一种,它们还具有代理检测API。

免费:
GetIPIntel - 他们每分钟最多允许15次查询。它正在积极开发中,他们声称使用机器学习来检测IP是否是代理。有各种使用本网站的CMS的插件,根据我的经验,结果非常准确。

如果您只遇到VPN问题,请查看W I T C H.它不是API实现,但它仍然是免费的。

答案 2 :(得分:0)

如果这符合您的需求,您可以查看此ip2proxy库https://github.com/ip2location/ip2proxy-php

以下是示例代码:

require 'class.IP2Proxy.php';

$db = new \IP2Proxy\Database();
$db->open('./samples/IP2PROXY-IP-PROXYTYPE-COUNTRY-REGION-CITY-ISP.SAMPLE.BIN', \IP2Proxy\Database::FILE_IO);

$records = $db->getAll('1.0.241.135');

if ($records['isProxy'] == 1){
    //This is a proxy, you may return 404 or redirect to other custom error page
}