nginx反向代理中通过前置过滤拦截sql注入与xss攻击,直接在server块用if+正则匹配query_string中的union select、script、javascript等高危特征并返回403。

在 Nginx 反向代理中实现严格的 SQL 注入与 XSS 防御,核心思路是:**在请求到达后端前,在 Nginx 层做前置过滤,拦截高危特征,不依赖后端处理**。这能显著降低服务器负载、缩短攻击链路、弥补 WAF 未覆盖或绕过 CDN 的盲区。
精准匹配查询字符串与 URI 中的注入特征
直接在 server 块中添加多层 if 判断,针对常见攻击载荷做正则匹配。注意:Nginx 的 if 在 location 外使用是安全的(只要不嵌套在 limit_req 等受限上下文中)。
- 拦截含 SQL 关键字的 query_string(URL 参数):
if ($query_string ~* "(unions+select|selects+.*s+from|inserts+into|drops+table|deletes+from|execs+|xp_cmdshell|declares+@|/*|*/|'--|;--|#)") { return 403; } - 拦截 XSS 常见标签与脚本行为:
if ($query_string ~* "(<script return></script> - 拦截 URI 中编码/空格包裹的关键字(防简单绕过):
if ($request_uri ~* "(%20|\+)(union|select|insert|update|delete|drop|exec)(%20|\+)") { return 403; } - 禁止 URL 中出现裸露的双引号、单引号、尖括号、分号等危险字符组合:
if ($query_string ~* "["';]|%22|%27|%3C|%3E|%3B") { return 403; }
阻断可疑请求方法与异常结构
限制合法 HTTP 方法,并拒绝畸形请求结构,从源头缩小攻击面。
- 只允许 GET 和 POST 方法,其他一律拒绝(用 444 彻底关闭连接,不发响应):
if ($request_method !~ ^(GET|HEAD|POST)$) { return 444; } - 禁止空格出现在 request_uri 中(常用于混淆):
if ($request_uri ~ " ") { return 403; } - 禁止点开头路径(如
/.git、/..)和连续点路径:
if ($request_uri ~ "^/.|/..|/.{3}") { return 403; } - 禁止十六进制编码路径(如
/):
if ($request_uri ~ "\x[0-9a-fA-F]{2}") { return 403; }
配合安全响应头强化浏览器端防护
即使请求侥幸通过,也要让浏览器主动防御反射型 XSS:
- 强制启用并阻断检测到的 XSS 行为:
add_header X-XSS-Protection "1; mode=block"; - 防止页面被嵌入恶意 iframe:
add_header X-Frame-Options "DENY"; - 启用内容安全策略(基础版,防内联脚本):
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none';";
隐藏服务指纹,减少信息泄露
攻击者常根据 Server 头、错误页、目录遍历等线索判断技术栈,进而定制攻击。必须显式关闭:
- 隐藏 Nginx 版本与标识:
server_tokens off; - 移除默认 Server 响应头(需安装
headers-more-nginx-module):
more_clear_headers "Server"; - 禁止访问敏感文件(.git、.env、.log、备份文件等):
location ~ /.(git|htaccess|htpasswd|env|log|bak|sql|conf)$ { deny all; return 404; } - 禁用目录列表(确保 autoindex 关闭):
autoindex off;











