Web 服务器被植入恶意代码(如尾部注入广告跳转)常因文件可写。将核心入口文件设为只读(0555 或 0444)可有效阻断此类攻击。本文提供可直接部署的 PHP 脚本实现动态权限切换。
chmod(filename, mode) 修改文件权限0555 = 所有者/组/其他 仅可读可执行(目录需可执行进入)0444 = 仅可读(更严格,但可能影响 require/include)<?php
function set_writeable($file_name, $mode = 0555) {
// 清除 stat 缓存确保获取最新状态
clearstatcache(true, $file_name);
if (@chmod($file_name, $mode)) {
echo "✅ 修改 $file_name 权限为 " . decoct($mode) . " 成功";
echo " (当前权限: " . decoct(fileperms($file_name) & 0777) . ")";
} else {
echo "❌ 修改失败:空间商可能禁用 chmod 或无文件所有权";
echo " (当前用户: " . get_current_user() . ")";
}
}
// 使用示例
set_writeable("index.php", 0555); // 只读+可执行
// set_writeable("config.php", 0444); // 纯只读
?>
<?php
function set_writeable($file_name, $mode = 0644) {
clearstatcache(true, $file_name);
if (@chmod($file_name, $mode)) {
echo "✅ 修改 $file_name 权限为 " . decoct($mode) . " 成功";
} else {
echo "❌ 修改失败,请检查 FTP/SSH 手动修复";
}
}
// 部署/更新时临时恢复写权限
set_writeable("index.php", 0644);
// 执行 composer update / 代码部署...
// 部署完成后立即恢复只读
set_writeable("index.php", 0555);
?>
/opt/scripts/)#!/bin/bash
# deploy.sh
php /opt/scripts/set_writable.php
git pull / composer install / rsync ...
php /opt/scripts/set_readonly.php
Linux 文件系统层面更强硬的保护(需 root):
# 设置不可变位(连 root 也不能修改/删除,需先去除)
chattr +i /var/www/html/index.php
# 移除不可变位
chattr -i /var/www/html/index.php
# 查看属性
lsattr /var/www/html/index.php
# 输出: ----i---------e---- index.php
优势:防止 root 账号被盗用时篡改、防止误操作删除。
| 防护层级 | 可防御 | 无法防御 |
|---|---|---|
| PHP chmod 0555 | PHP 脚本写入、WebShell 文件操作 | SSH/FTP 直接修改、root 权限、inode 绕过 |
| chattr +i | 所有用户空间写入、rm/mv/echo 重定向 | 物理访问、单用户模式、文件系统损坏修复 |
| WAF/文件监控 | 实时告警、自动恢复 | 零时差攻击、内核级 Rootkit |
index.php, config.php, .htaccess, 框架核心文件location ~* \.php$ { deny all; }0755,文件 0644,敏感文件 0444/0400find /var/www -type f -perm /o+w 发现异常可写文件git status 检查未跟踪/修改文件