静态资源请求需深度检测,因攻击者可通过恶意Referer、XSS参数、伪装WebShell等绕过扩展名过滤;必须用WAF在access阶段对URI、Header、Query、Body多维检测。

静态资源请求(如 .js、.css、.png、.woff2 等)虽不执行后端逻辑,但仍是攻击入口——恶意构造的 URL 参数、异常 User-Agent、含 XSS 片段的 Referer、伪装成静态资源的 WebShell 文件上传等,都可能绕过传统防护。Nginx 本身不解析请求体或深度校验报文语义,必须借助第三方 WAF 模块才能实现真正意义上的“深度报文检测”。核心在于:让 WAF 在 access 阶段介入,对完整 HTTP 请求头、URI、查询参数、甚至(在必要时)请求体进行多维度规则匹配。
为什么静态资源也需深度检测?
很多人误以为 location ~* \.(js|css|png|jpg)$ 就是安全终点,其实风险仍在:
- 攻击者可将恶意 payload 填入
Referer或X-Forwarded-For头,触发日志注入或 SSRF - 利用
/static/logo.png?xss=%3Cscript%3Ealert(1)%3C/script%3E绕过扩展名过滤,诱导前端 JS 解析执行 - 上传带恶意注释的 CSS 文件(如
/*<img src="https://img.php.cn/?x-oss-process=image/resize,p_40" alt="详解 Nginx 结合第三方 WAF 实现对静态资源请求的深度报文检测">*/),后续被内联渲染时触发 XSS - 通过伪造
Accept或Content-Type头,诱导 WAF 跳过检查逻辑(若规则未覆盖 MIME 场景)
主流方案选型与关键能力对比
当前适用于 Nginx 的成熟第三方 WAF 模块主要有三类,静态资源检测能力差异明显:
-
ngx_waf(推荐):原生支持 URI、Query、Header、Cookie、Body 多字段独立规则;默认启用高效 IP+URI 组合缓存,对高频静态资源访问无性能衰减;内置 OWASP CRS 兼容层,可直接加载
REQUEST-933-APPLICATION-ATTACK-PHP.conf等规则检测 PHP 伪静态漏洞 -
ngx_lua_waf(经典 Lua 方案):依赖 OpenResty,需手动编写
init_by_lua_file和access_by_lua_file;对 GET 类静态请求可做全头扫描,但 POST/PUT 类静态上传需显式开启lua_need_request_body on,否则跳过 body 检查 -
ModSecurity + nginx connector:规则最完备,但默认仅对非静态 location 生效;需配合
SecRuleEngine On+SecRequestBodyAccess On+ 显式location /upload/块启用,且高并发下易因正则回溯拖慢静态响应
配置要点:让 WAF 真正“看到”静态请求
默认 Nginx 配置中,静态资源常由 try_files 或 alias 直接返回,WAF 模块若未在正确阶段挂载,会完全跳过检测。必须确保:
- WAF 的
access_by_lua_file(或waf_rule指令)置于所有location块外部的http或server上下文中,避免被location ~* \.js$优先匹配而终止流程 - 禁用可能提前返回的指令干扰,例如移除
add_header X-WAF-Skipped "true"类调试头,防止被 CDN 或浏览器缓存固化 - 对需检测请求体的场景(如上传 favicon.ico 同时携带恶意 form-data),在对应 location 中显式设置
client_max_body_size 10m并确认 WAF 模块已启用 body 解析(如 ngx_waf 的waf_rule body指令) - 使用
waf_rule uri+waf_rule args+waf_rule header分离定义规则,比单条正则更精准——例如只拦截args:xss含<script></script>的请求,而不误杀含script字样的合法字体文件名
实战规则示例(以 ngx_waf 为例)
在 /usr/local/nginx/conf/waf/rules/static.conf 中添加:
# 拦截含 XSS 关键字的 URI 查询参数(不区分大小写)
waf_rule args "(?i)(%3cscript|%3ciframe|%6f%6e%65%72%72%6f%72)" deny;
<h1>拦截 Referer 中含 javascript: 伪协议(防日志/埋点 XSS)</h1><p>waf_rule header "Referer" "(?i)javascript:" deny;</p><h1>放行主流爬虫对 /static/ 下资源的访问(基于 UA+IP 双校验)</h1><p>waf_rule user_agent "Googlebot|Bingbot|YandexBot" allow;
waf_rule ip "8.8.8.0/24|2001:4860:4860::/64" allow;</p><h1>对 /upload/ 下所有请求强制检查请求体(含图片、字体等静态上传)</h1><p>location /upload/ {
waf_rule body "(?i)(eval(|system(|shell_exec()" deny;
alias /data/uploads/;
}</p>
注意:上述规则需在 http 块中通过 include waf/rules/static.conf; 加载,并确保 waf on; 已全局启用。
静态资源不是防护盲区,而是攻击者重点试探的“软接口”。只要 WAF 模块在 access 阶段完成全报文解析,配合分字段、可缓存、可绕过的精细化规则,就能在零影响正常加载的前提下,把 XSS、SSRF、恶意爬虫、WebShell 上传等威胁挡在第一道门之外。











