在nginx.conf中按路径分级配置client_max_body_size、client_body_buffer_size和client_body_timeout等指令,配合上传目录访问控制,可有效防御大文件及慢速上传攻击。

直接在 nginx.conf 里设好几道硬闸门,就能有效拒绝大文件恶意上传攻击。重点不是等文件传完再拦,而是在请求刚进来、还没进后端之前就切断。
按路径分级限制请求体大小
全局放开等于开门揖盗。必须把 client_max_body_size 放到具体 location 块里,按业务精准控制:
- 非上传接口(如
/api/login、/status):设为2k或1m,彻底堵死大 body 进入可能 - 明确上传路径(如
/upload、/api/v1/files):设合理上限,例如50m—— 够用,但远低于系统内存承受极限 - 完全禁用上传的路径(如静态资源目录):显式写
client_max_body_size 0,强制拒绝所有 POST 请求体
压低缓冲区,防内存被撑爆
client_body_buffer_size 决定多少数据能留在内存里。攻击者常故意发略超缓冲的数据,逼 Nginx 频繁刷盘甚至崩溃:
- 对非上传类 location,设为
4k或8k - 确保该值 ≤ 对应 location 的
client_max_body_size,否则缓冲还没起作用就被 413 拦截了 - 避免设成
128k以上,除非你确认服务器内存充足且上传量极大
加超时熔断,对付慢速上传
攻击者每秒只发几十字节,就能长期霸占 worker 连接。必须双超时配合:
-
client_header_timeout 5s:防止慢速发 header 耗尽连接槽 -
client_body_timeout 10s:从收到 header 后开始计时,body 中断或过慢即断连 - 这两项必须和
client_max_body_size写在同一个 location 块里,策略才真正生效
配套加固上传目录访问行为
即使上传成功,若目录可直接访问或执行脚本,攻击就已得手:
- 禁止解析脚本:
location ~ ^/uploads/.*\.(php|phtml|pl|py|sh|jsp|asp|aspx)$ { deny all; } - 关闭目录索引:
location /uploads/ { autoindex off; } - 屏蔽隐藏文件:
location ~ /\. { deny all; } - 隔离存储路径:用
client_body_temp_path /var/tmp/nginx-uploads/指向独立分区,并限制权限
不复杂但容易忽略:真正起作用的不是单个指令,而是 client_max_body_size、client_body_buffer_size、client_body_timeout 和路径级 location 的协同生效。











