去年给一个站搬家,数据库导完,网站打不开,报错说“缓存目录不可写”。
我当时急着上线,随手搜了一下,答案清一色是:“把目录权限改成 777 就好了。”
我照做。右键、属性、勾上全部权限、确定。网站唰一下就正常了,页面加载、后台、上传,全都通。那一刻我甚至还有点得意——你看,问题不就是这么简单。
三个月后,我的服务器被入侵了。一个从没见过的 PHP 文件,在某天凌晨悄悄出现在网站根目录,再过两天,我的站开始给别人发垃圾评论、挂违规广告。
后来复盘,出事的那台服务器上,好几个目录的权限,都还停在我当初图省事设的 777。
这篇文章就聊网站目录权限怎么设置才安全。这事看着特别不起眼,一个数字而已,但它是我踩过最贵的一个坑。
777 到底是什么,为什么它这么危险
先把这三个数字说清楚,不然讲安全全是空话。
Linux 里,每个文件、每个目录都有一组权限,分三档:属主、属组、其他人。每一档用三个位表示读(r)、写(w)、执行(x)。有权限就用 1 算,加起来换算成数字:
- r = 4
- w = 2
- x = 1
7 就是 4 + 2 + 1,读、写、执行全给。所以 777 的意思是:属主、属组、其他所有人,都能读、能写、能执行。
给目录设 777,等于在门上贴了张纸条:“谁都行,随便进,随便改。”
它危险在哪?服务器上不止你一个站。同一个服务器可能跑着好几个网站,用着同一个 PHP 运行用户。只要其中一个站被攻破,攻击者就能借这个“谁都可写”的权限,把恶意文件写进你的目录里,横向传染给所有站。
我那次就是这么中的招。一个朋友的测试站跟我的站放一台机器上,他的站先被打了,然后顺着可写目录爬过来,我这边跟着一起完蛋。
777 换来的那点方便,代价是把整台服务器的安全拱手让人。
那正确的权限该怎么设
踩坑之后我老老实实去翻资料,还看了 WordPress 官方关于文件权限的说明。结论其实很朴素:
| 对象 | 推荐权限 | 说明 |
|---|---|---|
| 目录(文件夹) | 755 | 属主可读写执行,其他人只能读和执行 |
| 普通文件 | 644 | 属主可读写,其他人只能读 |
wp-config.php | 600 或 640 | 里面有数据库密码,越少人碰越好 |
上传目录(如 wp-content/uploads) | 755 | 需要可写,但属主要归 Web 运行用户 |
记不住也没关系,记住一句话就行:目录 755,文件 644,配置文件更严一点。
关键还有一点,比数字本身还重要——文件的属主和属组,得是 Web 服务运行的那个用户(宝塔环境里通常是 www)。
很多人改权限只改数字,不管属主,结果就是:权限设成 755 了,网站还是写不进去。因为 755 里“属主”那一档才有写权限,可属主不是你网站程序的用户,程序当然写不了。
这就是“改成 777 就好了”这句话骗人的地方。 它之所以“管用”,不是因为权限设对了,而是因为它把“其他人”那一档也开成了可写,等于用最粗暴的方式绕过了属主问题。正确做法是修属主,不是开 777。
具体怎么改,宝塔里点几下就行
如果你用的是宝塔面板,这事其实不难。
进“文件”页面,选中要改的目录或文件,右键“权限”,把数字填进去,下面勾选“应用到子目录”,确定。
不过更稳的办法是用命令。宝塔里打开终端,进到网站根目录,先批量把目录设成 755,再把文件设成 644:
# 目录全部设为 755
find /www/wwwroot/你的站点 -type d -exec chmod 755 {} \;
# 文件全部设为 644
find /www/wwwroot/你的站点 -type f -exec chmod 644 {} \;
# 把属主和属组统一改成 Web 运行用户(宝塔一般是 www)
chown -R www:www /www/wwwroot/你的站点
上面这几条,是很多前辈总结出来的“教科书组合”,我照做之后,网站读写一切正常,再也不用碰 777。
动手之前,记得先备份。 万一命令敲错路径,还有个回头的余地。备份这事我在这篇里单独写过,别嫌我啰嗦,是真吃过亏。
改完之后网站又写不进去了,怎么办
我改完权限第一天,后台传图片就报错了。这里给两个最常见的排查方向,基本能覆盖九成情况。
一是属主不对。 用 ls -l 看一眼文件的属主属组,如果不是 www,那就是属主问题,用上面那条 chown 修一下。
二是目录多了一层权限位。 有个东西叫 chattr +i 之类的“不可变”属性,会连属主都不让写。一般不用管,真遇到了把它去掉就行。
三是缓存目录。 有些程序(包括 WordPress)的缓存目录、上传目录,确实需要独立放宽一点。这种目录单独设成 755 并保证属主正确就够了,依然不需要 777。
如果实在排查不出来,把具体的报错信息和文件路径贴出来搜一下,基本都有现成答案。但请记住一点:照着“777 就好了”去改,问题看似没了,安全也一起没了。
权限只是其中一环,这几件事最好一起做
权限设对了,不代表高枕无忧。那次事故后,我把这几个也一起补上了。
别用 root 跑 PHP。 用 root 跑,一旦程序被拿下,攻击者拿到的是整台服务器的最高权限。宝塔默认用的是独立用户,别自己改回去。
上传目录禁止执行 PHP。 这是防 webshell 的关键一招。目录权限对了,但允许在里面执行 PHP,攻击者传一个木马上去照样能跑。在 Nginx 里限制上传目录只能访问静态文件,具体怎么配我在后台安全加固那篇里提过。
关掉用不到的危险函数。 exec、system、shell_exec 这类函数,能关就关,很多后门程序就靠它们吃饭。
定期扫一遍可疑文件。 我出事那次,那个陌生 PHP 文件其实已经在根目录躺了两天。如果我有定时扫文件的习惯,是能早点发现的。用网站挂马清理那篇里的思路,定期过一遍目录,心里踏实。
现在回头看,整件事最讽刺的地方是:我当初怕麻烦,图的是省那两分钟;后来清理入侵、恢复站点、给搜索引擎善后,我花了整整一个周末。
选 755 还是 777,说白了就差两个数字。可这两个数字背后,是“我知道自己在做什么”,和“我赌不会出事”的区别。
安全上偷的懒,从来不会消失,它只会换个时间,连本带利地找你还。
来自 wujianzhan.com,一个分享建站与 SEO 实战的博客。
