PHP文件权限应遵循最小权限原则:脚本文件设644,敏感配置文件设600,可写目录设755或775并禁用PHP执行,上传目录须配合Web服务器配置禁止脚本解析,所有权应分离(开发者所有、www-data组协同),严禁全局777。

PHP文件权限过大,比如出现777、755(对脚本文件)、666等,容易引发安全风险——攻击者可能篡改代码、上传木马、执行恶意脚本。收紧权限不是简单“一刀切”,而是按角色和用途分级控制,核心是最小权限原则:只给Web服务器进程(如www-data、nginx、php-fpm用户)完成任务所必需的权限,其余一律禁止。
明确谁在运行PHP,再收权
权限是否生效,取决于执行PHP的系统用户。比如:
- Apache通常用
www-data用户 - Nginx + PHP-FPM 常用
www-data或自定义用户(如nginx) - 宝塔面板默认也是
www-data
你得先确认当前PHP执行身份:
<?php echo exec('whoami'); ?>或更准确的方式:
立即学习“PHP免费学习笔记(深入)”;
<?php var_dump(posix_getpwuid(posix_geteuid())); ?>
拿到用户名后,后续所有 chown 和权限设置都围绕它展开。
分类收紧:文件、目录、特殊目录区别对待
不要全盘 chmod -R 644 /www/wwwroot,那样会破坏可写目录功能。应分类处理:
-
PHP脚本文件(.php)
设为644:所有者可读写,组和其他人仅读find /www/wwwroot/your-site -type f -name "*.php" -exec chmod 644 {} \; 普通静态文件(.html/.css/.js/.jpg等)
同样644,无需执行权限-
目录(不含上传、缓存等)
设为755:所有者可读写执行(进入+列表),组和其他人可读+执行(仅能进入,不能删改)find /www/wwwroot/your-site -type d -exec chmod 755 {} \; -
必须可写的目录(如
storage/、runtime/、public/uploads/)
设为755或775(如果需开发用户协同写入),但必须确保归属正确:chown -R www-data:www-data storage/ runtime/ public/uploads/ chmod -R 755 storage/ runtime/ public/uploads/
⚠️ 注意:
uploads/目录还要在Nginx/Apache中禁用PHP解析,防止上传.php文件被执行。 -
敏感配置文件(如
.env、config.php)
移出Web根目录(推荐),若必须留在内,则设为600(仅所有者读写):chmod 600 /www/wwwroot/your-site/.env
所有权比权限数字更重要
光改 chmod 不够,还得配 chown:
- 所有文件归开发者用户(如
admin),组设为www-data - 所有可写目录及其中内容,归
www-data:www-data
这样既能保证开发者编辑代码,又让Web服务拥有运行和写入权限,避免依赖777。
例如:
# 整站文件归开发者,组为www-data chown -R admin:www-data /www/wwwroot/your-site # 可写目录单独归www-data chown -R www-data:www-data /www/wwwroot/your-site/storage chown -R www-data:www-data /www/wwwroot/your-site/public/uploads
额外加固项(不改权限但防越权)
- 在
php.ini中启用open_basedir,限制脚本能访问的路径范围 -
disable_functions加上exec,system,shell_exec,passthru,proc_open等危险函数 - Web服务器配置中,对
uploads/目录禁用PHP:
Nginx示例:location ~ ^/public/uploads/.*\.(php|php5|phtml|php3|php4|sh|shell)$ { deny all; }Apache示例(
.htaccess):<Files "*.php"> Require all denied </Files>
不复杂但容易忽略——权限收紧的关键不在数字本身,而在“谁”拥有它、“为什么”需要它、“哪里”可以绕过它。



















