Web服务器可写源代码是否安全?Laravel public目录权限优化咨询
Laravel Public目录权限安全问题解答
场景说明
我完成了PHP Laravel框架的全新安装,发现public目录下所有文件及文件夹的所有者已被递归设置为Web服务器用户www-data,目录权限信息如下:
vagrant@dev:/laravel-app/public$ ls -al total 20 drwxr-xr-x 2 www-data www-data 4096 Aug 10 09:19 . drwxr-xr-x 12 www-data www-data 4096 Sep 15 10:39 .. -rw-r--r-- 1 www-data www-data 0 Aug 10 09:19 favicon.ico -rw-r--r-- 1 www-data www-data 603 Aug 10 09:19 .htaccess -rw-r--r-- 1 www-data www-data 1710 Aug 10 09:19 index.php -rw-r--r-- 1 www-data www-data 24 Aug 10 09:19 robots.txt
问题解答
1. 让Web服务器拥有源代码文件的写入权限是否安全?
绝对不安全。一旦Web服务器进程(www-data)拿到源代码的写入权限,只要服务器被攻破(比如存在代码执行、文件上传漏洞),攻击者可以直接篡改index.php、.htaccess这类核心文件植入后门,甚至修改整个应用的业务逻辑,后续的攻击和权限维持会变得异常简单,而且事后很难排查出被篡改的痕迹。
Laravel的权限原则是最小权限原则:Web服务器只需要读取源代码的权限就能正常运行,写入权限只应该开放给storage、bootstrap/cache这类应用运行时必须写入日志、缓存的目录,源代码文件(包括public下的所有源码文件)绝对不能给Web服务器写入权限。
2. 是否需要移除public目录的写入权限以提升应用文件结构的安全性?
必须移除。从你给出的权限来看,当前public目录的所有者是www-data,意味着Web服务器可以随意修改这里的文件,风险极高。
给你一套标准的权限修复操作:
- 先把public目录及所有文件的所有者改回开发用户(比如你的
vagrant用户):sudo chown -R vagrant:vagrant /laravel-app/public - 然后设置正确的目录和文件权限:
# 设置目录权限为755(所有者可读可写可执行,组和其他可读可执行) sudo find /laravel-app/public -type d -exec chmod 755 {} \; # 设置文件权限为644(所有者可读可写,组和其他只读) sudo find /laravel-app/public -type f -exec chmod 644 {} \;
如果你的应用需要在public目录下存放用户上传的文件(比如头像、附件),不要给整个public目录开写入权限,单独创建一个子目录(比如public/uploads),把这个子目录的所有者设为www-data,权限设为755即可,这样既能满足业务需求,又把风险控制在最小范围。
内容的提问来源于stack exchange,提问作者YanDatsiuk
相关产品推荐
相关产品推荐

