Nginx 安全配置:从响应头到目录穿越的十项检查
Web 服务器的加固有两层:不暴露多余信息,以及不给异常请求留口子。
很多事故不是漏洞利用,而是「配置允许了不该允许的事」。
先说结论
关版本号、加安全头、限方法与大包、上传目录禁执行。 四条覆盖大部分风险。
- server_tokens off 隐藏版本
- HSTS、X-Content-Type-Options、Referrer-Policy
- 限制 client_max_body_size 与请求方法
- location 精确匹配,禁用 autoindex
漏洞是怎么产生的
安全响应头是「低成本高收益」:浏览器据此启用防护,服务端不用改一行业务代码。
目录穿越类问题常出在 alias 与 try_files 的写法上,需要逐个 location 核对。
修复与验证
修复不是改一行代码,而是四件事一起做:
- server_tokens off,隐藏版本与错误页细节
- 统一加安全响应头(HSTS 需先确保全站 HTTPS)
- 只允许必要方法,其余返回 405
- 限制上传大小与超时,防慢速攻击
- 上传目录 location 关闭脚本执行,禁用 autoindex
攻击面与检测点
按影响面排序,先修影响最大的:
| 配置 | 作用 | 建议 |
|---|---|---|
| server_tokens | 隐藏版本 | off |
| Strict-Transport-Security | 强制 HTTPS | max-age=31536000 |
| X-Content-Type-Options | 禁 MIME 嗅探 | nosniff |
| client_max_body_size | 限制上传 | 按业务设 |

几个容易踩的坑
下面这些是最常见的错误做法:
- HSTS 在还没全站 HTTPS 时开启:用户被锁在外
- alias 路径拼接错误:可穿越目录
- 上传目录可解析 PHP:一个文件就是后门
- 错误页泄露堆栈与路径
写在最后
Nginx 加固是「删掉不需要的能力」,越简单越安全。
安全不是一次加固,是持续的假设:假设输入不可信、假设边界会破、假设有人会看错。
评论 (3)
修复清单比漏洞描述有用多了,很多文章只讲怎么打不讲怎么防。
白名单那条永远是最有效的,正则黑名单迟早绕过。
建议再补一条:把这类检查加到 CI 里,靠人记必然漏。
发表评论