nginx作为轻量高效网关,可通过正则匹配阻断sql注入(如单引号、union/select等)、封禁恶意ua、限流、屏蔽敏感路径、隐藏版本号、限制http方法及请求体大小,并配合modsecurity与日志追踪提升防护能力。

用Nginx做网关时,不加防护的暴露后端服务等于把数据库钥匙挂在门口。SQL注入和恶意爬虫不是“会不会来”的问题,而是“什么时候来”的问题——而Nginx是第一道也是最轻量高效的防线。
拦截SQL注入的关键模式
SQL注入请求往往携带典型特征:单引号、双破折号(--)、分号(;)、关键字如 union select、sleep(、benchmark( 等。Nginx本身不解析SQL语义,但可通过正则匹配请求参数、URI、请求体(需配合body_filter)中的高危模式进行阻断。
- 在 http 或 server 块中定义规则,用 map 提前标记风险请求
- 对 $args 和 $request_uri 做多层正则检测,例如:
map $args $sql_inj_args {
~*[\"'`;\(\)\/\*%00] 1;
~*(select|union|insert|update|delete|drop|sleep|benchmark|load_file) 1;
default 0;
} - 结合 if + return 403 实时拦截,注意避免在 location 外滥用 if;推荐统一收口到 rewrite 阶段或使用第三方模块如 nginx-module-security
识别并限制恶意爬虫行为
真实爬虫不可怕,可怕的是高频、无 User-Agent、伪造 Referer、绕过 robots.txt、集中扫敏感路径(如 /phpmyadmin/、/wp-admin/)的自动化流量。Nginx 可基于请求头、频率、路径特征做初步过滤。
- 封禁空或可疑 User-Agent:
if ($http_user_agent ~ ^(curl|wget|httpclient|python-requests|java|masscan|nmap|nikto)) { return 403; } - 限制访问频次:用 limit_req_zone 对 IP 或 User-Agent 哈希限流,例如每秒最多 3 次请求,突发允许 5 次
limit_req_zone $binary_remote_addr zone=perip:10m rate=3r/s;
在 location 中启用:limit_req zone=perip burst=5 nodelay; - 屏蔽扫描类路径:
location ~* ^/(phpmyadmin|wp-admin|adminer|\.git|\.env|web\.config) { return 404; }
增强防护的实用补充手段
单靠基础配置易被绕过,需叠加简单但有效的加固点。
- 隐藏 Nginx 版本号:server_tokens off;,减少指纹暴露
- 拒绝非标准 HTTP 方法(如 TRACE、OPTIONS),除非业务明确需要:
if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|PATCH|OPTIONS)$) { return 405; } - 对 POST 请求体做长度限制(防超长 payload 注入):client_max_body_size 2m;
- 开启 modsecurity(Nginx + ModSecurity3)可实现规则引擎级防护,但需额外编译与调优,适合中高安全要求场景
验证与日志追踪建议
规则上线后必须验证是否误杀正常流量,并持续观察拦截效果。
- 在 access_log 中添加自定义字段记录触发规则的请求,例如:
log_format security '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$sql_inj_args" "$bad_ua";' - 用 tail -f 实时监控日志,筛选含 403 或 405 的条目,确认拦截关键词是否命中预期
- 定期导出异常 UA/IP,加入 deny 列表或对接 fail2ban 进行自动封禁










