Nginx 通过协议层校验(Content-Type、请求体大小、Host/Referer、扩展名及参数指纹)拦截低级恶意上传,不解析内容但可高效过滤异常请求。

Nginx 本身不解析请求体内容,无法像 WAF 那样做语法或语义分析,但可通过协议层、传输层特征进行格式校验,有效拦截大量低级恶意上传行为。核心思路是:不看“里面写了什么”,而看“它像不像合法上传”。
检查 Content-Type 是否符合表单上传规范
真实文件上传请求必须携带 multipart/form-data,且含正确的 boundary。Nginx 可在入口直接拦截明显异常类型:
- 用
if ($content_type !~ "^multipart/form-data;") { return 403; }拒绝非 multipart 请求(如 text/plain、application/json) - 对仅允许图片上传的接口,可进一步收紧:
if ($content_type !~ "^multipart/form-data;.*boundary=") { return 403; } - 避免仅靠后缀判断——攻击者常把 Webshell 命名为
avatar.jpg,但 Content-Type 设为text/plain绕过前端校验
限制请求体大小并结合长度阈值做硬拦截
普通业务上传(头像、证件照)极少超过 5MB;而带反弹 shell 或数据库导出功能的 Webshell 往往达 10MB+。利用 Nginx 原生变量精准防控:
-
$request_length是实际接收字节数,不受 gzip/编码干扰,比$body_bytes_sent更可靠 - 在非上传接口 location 中设严限:
if ($request_length > 262144) { return 413; }(256KB) - 上传接口单独配置:
client_max_body_size 5m;,并确保client_body_buffer_size合理(如 128k),避免大文件全进内存
校验 Host 与 Referer 的基础可信性
虽不能验证内容,但可筛掉大量自动化工具和扫描器发起的畸形请求:
- Host 头伪造是虚拟主机探测常见手法:
if ($host !~ ^(example\.com|api\.example\.com)$) { return 444; }(444 立即断连) - Referer 为空或来自陌生域名,可能为脚本直传:
valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 403; } - 注意:Referer 和 Host 均可伪造,该策略只作初级过滤,不可替代 Token 或签名认证
拦截高危扩展名与可疑参数组合
重点不是“识别 Webshell”,而是阻断典型上传路径中的异常信号:
- 统一转小写、URL 解码、去除 \x00 后匹配扩展名,防
.php%00.jpg类绕过 - 不单靠
$request_filename,而应在 upload 表单字段中提取 filename 值(需 OpenResty + Lua 或 nginx-upload-module) - 拒绝含明确攻击指纹的参数:
if ($args ~* "(cmd=|exec=|system=|antSword|behinder)") { return 403; }


















