网站安全防护:常见恶意 UA 特征与拦截方案详解
在网站安全防护中,User-Agent(UA) 是一个重要的识别信号。虽然它通常是用来标识客户端的浏览器类型和版本,但也可以作为识别爬虫、恶意扫描工具和渗透攻击行为的重要依据。
对于一些无价值的访问(例如恶意爬虫、批量扫描、漏洞探测),我们可以直接通过 UA 黑名单 的方式进行拦截,减少无意义的带宽消耗和安全风险。本文将详细介绍常见恶意 UA 的特征、风险,以及如何高效拦截它们。
一、为什么要拦截恶意 UA?
- 减少服务器负载:恶意爬虫会频繁访问网站页面,增加服务器压力。
- 节省带宽成本:无意义的流量浪费宝贵的带宽资源。
- 降低安全风险:安全扫描器和渗透测试工具可能尝试利用漏洞攻击网站。
- 优化访问质量:减少垃圾请求,提高真实用户的访问体验。
二、常见恶意 UA 类型与特征
1. 编程语言/HTTP 库类 UA(多为爬虫、批量请求)
UA 特征 | 说明 |
---|---|
Python | Python 内置的 urllib 、urllib3 ,常用于爬虫或批量抓取。 |
Java | Java 的 HttpURLConnection 或 HttpClient ,用于批量访问或 API 调用。 |
Go-http-client | Go 语言的 net/http 标准库,Go 程序发起的请求。 |
curl | 命令行 HTTP 工具 cURL,常用于脚本下载或接口测试。 |
Wget | 另一款命令行下载工具,适合批量下载网页/文件。 |
Apache-HttpClient | Java 企业级 HTTP 客户端库。 |
okhttp | Android 和 Java 中常见的 HTTP 客户端。 |
node-fetch | Node.js 环境的 HTTP 请求库。 |
axios | 流行的 JavaScript HTTP 客户端。 |
php | PHP 脚本发起的 HTTP 请求,可能是爬虫或自动化脚本。 |
Ruby | Ruby 的 Net::HTTP 库。 |
PostmanRuntime | Postman API 调试工具发起的请求。 |
RestSharp | .NET 的 HTTP 客户端库,常用于批量请求。 |
2. 安全扫描 / 渗透测试工具类 UA(高风险)
UA 特征 | 说明 |
---|---|
sqlmap | SQL 注入漏洞检测工具。 |
nmap | 网络扫描工具,可能包含 HTTP 探测功能。 |
Metasploit | 著名渗透测试框架,可能尝试利用漏洞。 |
Nikto | Web 漏洞扫描器,用于检测常见安全漏洞。 |
zgrab | 网络扫描工具,用于 Banner 抓取。 |
masscan | 高速端口扫描器,可进行大规模探测。 |
wpscan | WordPress 漏洞扫描器。 |
三、拦截方法
1. WordPress - WP Safe 插件
支持设置 UA 黑名单,包含上述关键字即可屏蔽对应访问。
操作路径:
WP 后台 → 设置 → WP Safe → UA 黑名单 → 添加 UA 关键字示例:
Python Java Go-http-client curl Wget Apache-HttpClient okhttp node-fetch axios php Ruby PostmanRuntime RestSharp sqlmap nmap Metasploit Nikto zgrab masscan wpscan
2. Nginx 配置拦截
if ($http_user_agent ~* (Python|Java|Go-http-client|curl|Wget|Apache-HttpClient|okhttp|node-fetch|axios|php|Ruby|PostmanRuntime|RestSharp|sqlmap|nmap|Metasploit|Nikto|zgrab|masscan|wpscan)) {
return 403;
}
- ~*:表示不区分大小写匹配。
- return 403:直接拒绝访问。
3. Apache 配置拦截(.htaccess)
SetEnvIfNoCase User-Agent "Python" bad_bot
SetEnvIfNoCase User-Agent "Java" bad_bot
SetEnvIfNoCase User-Agent "Go-http-client" bad_bot
SetEnvIfNoCase User-Agent "curl" bad_bot
SetEnvIfNoCase User-Agent "Wget" bad_bot
SetEnvIfNoCase User-Agent "Apache-HttpClient" bad_bot
SetEnvIfNoCase User-Agent "okhttp" bad_bot
SetEnvIfNoCase User-Agent "node-fetch" bad_bot
SetEnvIfNoCase User-Agent "axios" bad_bot
SetEnvIfNoCase User-Agent "php" bad_bot
SetEnvIfNoCase User-Agent "Ruby" bad_bot
SetEnvIfNoCase User-Agent "PostmanRuntime" bad_bot
SetEnvIfNoCase User-Agent "RestSharp" bad_bot
SetEnvIfNoCase User-Agent "sqlmap" bad_bot
SetEnvIfNoCase User-Agent "nmap" bad_bot
SetEnvIfNoCase User-Agent "Metasploit" bad_bot
SetEnvIfNoCase User-Agent "Nikto" bad_bot
SetEnvIfNoCase User-Agent "zgrab" bad_bot
SetEnvIfNoCase User-Agent "masscan" bad_bot
SetEnvIfNoCase User-Agent "wpscan" bad_bot
Order Allow,Deny
Allow from all
Deny from env=bad_bot
四、注意事项
- UA 可伪造:黑名单不能完全阻止恶意访问,高级攻击者会伪装成正常 UA。
- 误杀风险:有些开发调试请求可能带有这些 UA,如果是内部测试,需要放行。
- 配合其他策略使用:如 IP 黑名单、防火墙(WAF)、速率限制等。
五、总结
拦截恶意 UA 是网站安全防护的第一道门槛,能够有效减少垃圾流量和降低安全风险。建议站长在防护中结合 UA 黑名单、IP 封禁、访问频率限制等多种手段,形成更完整的安全体系。