ThinkPHP文件权限安全需遵循最小权限、路径隔离、执行禁用原则:上传目录须移出public并禁用PHP解析;.env等敏感文件设600权限;PHP脚本644、静态资源644、runtime/logs目录755;php.ini禁用危险函数并启用open_basedir。

ThinkPHP 文件权限设置不能只靠 chmod 数字,关键在于“谁运行、存哪、怎么读、是否可执行”四点联动。核心原则是:最小权限 + 路径隔离 + 执行禁用。
上传目录必须移出 public,且禁用脚本执行
上传文件绝不能放在 public/uploads 这类 Web 可直访路径下。否则攻击者猜中路径(如 /uploads/2024/shell.php)就能直接执行后门。
- 把上传根目录设为 runtime/uploads 或 storage/uploads —— 这两个目录默认不在 Web 根目录内,Nginx/Apache 无法通过 URL 直接访问
- 在 Nginx 配置中显式禁止该路径下 PHP 解析:
location ~ ^/runtime/.*\.php$ { return 403; } - Apache 下可在 runtime 目录放
.htaccess,写入php_flag engine off - Linux 权限设为 755(目录),确保 Web 进程(如 www-data)能写入,但不赋予组/他人执行权限
敏感文件单独设权限,配置文件必须严格限制
数据库配置、.env、密钥文件等一旦泄露等于交出系统控制权。
- .env 和 config/database.php 等文件权限应设为 600(仅所有者可读写)
- 整个 config/ 目录建议设为 750,所属组可读,其他人无任何权限
- Nginx/Apache 需额外加规则屏蔽访问:
location ~ /\.(env|git|ht) { deny all; }
PHP 脚本与静态资源按角色分权
不是所有文件都该有相同权限,要区分“可执行”和“只读”两类。
立即学习“PHP免费学习笔记(深入)”;
- 控制器、模型、中间件等 PHP 脚本:统一设为 644(所有者读写,组/他人只读)
- public 下的 JS/CSS/图片等静态资源:可设为 644,无需执行权限;目录设为 755
-
runtime/ 和 logs/ 目录:Web 进程需写入,设为 755;若环境允许,建议属主为
www-data:www-data,避免用 root 写入
PHP 运行时也要加固,不止改文件权限
文件权限只是基础,PHP 自身行为同样影响安全边界。
- 在
php.ini中禁用危险函数:disable_functions = exec,passthru,shell_exec,system,proc_open,popen - 启用
open_basedir限制脚本可访问路径,例如:open_basedir = /var/www/html/:/tmp/(包含临时目录) - 上传处理中必须用
finfo_file()校验真实 MIME 类型,不能只信扩展名或$_FILES['type'] - 所有用户上传的文件,下载必须走 PHP 控制器,用
readfile()输出并加响应头:header('X-Content-Type-Options: nosniff');header('Content-Disposition: attachment; filename="safe.pdf"');



















