Nginx禁用目录脚本执行的核心是严格限制仅入口文件(如/index.php)可解析,上传目录须用deny all或internal禁止直连,并移除.py/.wsgi等匹配规则。

直接禁用目录脚本执行,是防止上传木马、路径穿越和任意代码执行的关键一步。核心不是“堵住所有后门”,而是让 Nginx 从设计上就不把脚本当可执行对象来处理。
明确禁止非入口目录的 PHP/Python 解析
默认情况下 Nginx 不执行脚本,它只是转发请求。风险来自错误配置——比如把 location ~ \.php$ 放在全局,导致 /upload/test.php 也能被 php-fpm 执行。
- 只允许明确的入口文件匹配:用
location ~ ^/(index|api/index)\.php$替代宽泛的location ~ \.php$ - 对上传、静态资源目录单独加 location 块,并显式拒绝:
location ^~ /upload/ { deny all; }或location ^~ /static/ { return 403; } - 彻底删除配置中任何
location ~ \.py$、location ~ \.wsgi$等 Python 相关转发规则,除非你确实在用 CGI(不推荐)
用 internal 和 try_files 防绕过执行
攻击者常通过 /upload/photo.jpg/.php 或 /upload/.php 这类构造绕过后缀过滤。仅靠正则匹配不够,需配合 Nginx 内部机制。
- 上传目录启用
internal;:location ^~ /upload/ { internal; root /var/www/site; }—— 用户无法直连,只能由内部指令(如alias+try_files)访问 - 静态资源 location 中强制校验真实文件:
location ^~ /images/ { root /var/www/site; try_files $uri =404; }—— 不存在的路径直接 404,不交给后端 - 避免在 upload 目录下使用
alias,改用root+try_files组合,防止路径解析偏差
系统层权限配合:移除执行位 + 最小用户权限
配置再严,如果文件本身有执行权或 Nginx 进程权限过高,依然可能被利用。
- 上传目录禁止执行位:
chmod -R a-x /var/www/site/upload—— 确保即使误传 .php 文件,系统也不允许执行 - Nginx 必须以低权限用户运行:
在nginx.conf开头确认user nginx nginx;,且该用户无登录权限(useradd -r -s /sbin/nologin nginx) - 网站根目录属主设为
root:nginx,权限750;静态文件统一644;上传目录属主www-data:nginx(按实际用户调整),权限750
验证是否生效的三个关键测试
改完配置不能只 reload 就算完,必须人工验证边界情况。
- 上传一个
test.php到/upload/,浏览器访问https://yoursite.com/upload/test.php→ 应返回 403 或 404,而非显示源码或执行结果 - 尝试路径穿越:
https://yoursite.com/upload/..%2fetc%2fpasswd或/upload/.php→ 必须 403 或 404 - 检查响应头:
curl -I https://yoursite.com/anyfile.txt→ 确认没有X-Powered-By或泄露后端信息的 header


















