如何检测或阻止代理浏览

Posted

技术标签:

【中文标题】如何检测或阻止代理浏览【英文标题】:How to Detect or prevent proxy browsing 【发布时间】:2015-12-04 05:27:23 【问题描述】:

我建立了一个网站,我想在我的网站中限制代理浏览。我有搜索和谷歌这个问题,但我没有得到适当的方法来做到这一点, 有什么方法可以检测/防止代理浏览?

【问题讨论】:

一些你应该用谷歌搜索的东西:HTTP_X_FORWARDED_FOR、公共代理列表、check.torproject.org/cgi-bin/TorBulkExitList.py 等等...... 有几种方法可以改进代理检测。但是,100% 傻瓜证明检测不存在。 【参考方案1】:

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

    您的检测方法越好,您的服务器就会越慢。 这绝不是 100% 万无一失的!无论您尝试什么,都无法检测并阻止所有这些。 有少数人有正当理由使用代理。例如来自中国的人,他们的封面屏蔽了很多网站。

那我应该怎么做呢? 有更好、更安全的方法来保护您的服务器/网站。有很多方法可以将它们全部命名,但其中有几个是:

正则表达式 - 控制用户输入。 安全文件上传/下载 - 有关详细信息,请参阅this PDF 文件。 通过 SMS 之类的方式激活帐户 - 不是 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 找到。请始终牢记,使用这些方法会成倍地降低您的服务器速度!这就是为什么我建议使用不同的方法保护您的服务器/网站。

【讨论】:

【参考方案2】:

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

付费:MaxMind - 通过 API 进行代理检测,5 美元 / 1000 次查询。作为 GeoIP 数据库及其欺诈检查系统最知名的公司之一,他们还拥有代理检测 API。

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

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

【讨论】:

您可以下载和导入所有已知代理的免费 LITE 数据库并在本地匹配。 lite.ip2location.com/database/…【参考方案3】:

您可以查看这个 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

【讨论】:

以上是关于如何检测或阻止代理浏览的主要内容,如果未能解决你的问题,请参考以下文章

如何从 php 中的用户代理字符串中检测浏览器欺骗和机器人

如何在charles代理中阻止localhost流量?

如何防止用户代理被用户更改

使用 JavaScript 检测 iPad 应用内浏览器用户代理

测试是不是可以从 Web 浏览器访问 URL,即确保没有被代理服务器阻止

从用户代理或 Javascript 检测 64 位或 32 位 Windows?