如何检测或阻止代理浏览
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
【讨论】:
以上是关于如何检测或阻止代理浏览的主要内容,如果未能解决你的问题,请参考以下文章
使用 JavaScript 检测 iPad 应用内浏览器用户代理