Nginx 防非法文件上传的核心是限制上传后文件的访问与执行。需禁止脚本解析、关闭目录索引、限制请求大小、隔离危险路径,并对上传目录实施扩展名白名单与隐藏文件屏蔽。

限制非法文件上传访问,核心不是“拦住上传动作”,而是防止上传后的文件被恶意执行或泄露。Nginx 本身不处理文件上传逻辑(那是后端应用的事),但它能严格控制上传目录的访问行为——禁止解析、禁止浏览、禁止直接下载敏感类型。
禁止上传目录中执行脚本文件
上传目录(如 /uploads/、/data/)绝不能允许 PHP、Shell、Python 等脚本被 Nginx 解析执行。否则攻击者上传一句话木马即可接管服务器。
- 把这类 location 规则放在 PHP 处理块之前(顺序很重要)
- 匹配路径前缀 + 扩展名组合,例如:
location ~ ^/uploads/.*\.(php|php5|phtml|pl|py|sh|rb|jsp|asp|aspx)$ {
deny all;
}
同理可扩展到 /static/、/media/、/avatar/ 等用户可写目录。
关闭目录索引,防止文件遍历泄露
如果开启 autoindex on,攻击者可通过 URL 枚举上传目录下的所有文件名(如 /uploads/),再针对性下载或触发。
- 确保所有上传相关 location 中明确关闭目录列表:
- location /uploads/ {
autoindex off;
# 其他限制规则...
} - 避免使用 root 指向系统级路径(如
root /;),防止意外映射到敏感位置
限制上传文件大小与超时,缓解资源耗尽
过大的上传请求可能拖垮服务,或为 DoS 攻击提供入口。需在 http 或 server 块中统一设限:
-
client_max_body_size:设定单次请求最大体积(如
20M),超出返回 413 -
client_body_timeout:上传过程空闲超时(如
60s),防慢速攻击 - client_body_buffer_size:内存缓冲区大小,影响小文件是否落盘
注意:该限制只作用于 Nginx 接收阶段,后端(如 PHP、Node.js)仍需单独配置 multipart 限制,否则可能绕过。
隔离上传路径,拒绝点文件和隐藏目录访问
攻击者常尝试访问 /.git/config、/uploads/.htaccess 或 /uploads/backup.zip 等非预期资源。
- 显式屏蔽以点开头的路径:
- location ~ /\. { deny all; }
- 精确拦截常见危险路径:
- location ~ ^/(.git|.svn|.hg|.idea|__pycache__)/ { deny all; }
- 对上传目录内特定文件也做白名单式防护,例如只允许
.jpg、.png、.pdf被访问,其余一律拒之


















