首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 设置文件只读属性防篡改:index.php 安全加固实战

     編輯:PHP 綜合知識

文件权限控制实战:通过 chmod 设置 index.php 只读防恶意篡改

Web 服务器被植入恶意代码(如尾部注入广告跳转)常因文件可写。将核心入口文件设为只读(0555 或 0444)可有效阻断此类攻击。本文提供可直接部署的 PHP 脚本实现动态权限切换。

核心原理

  • chmod(filename, mode) 修改文件权限
  • 0555 = 所有者/组/其他 仅可读可执行(目录需可执行进入)
  • 0444 = 仅可读(更严格,但可能影响 require/include)
  • 需 PHP 进程用户拥有文件所有权或 sudo 权限

设置只读脚本 (set_readonly.php)

<?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); // 纯只读
?>

恢复可写脚本 (set_writable.php)

<?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);
?>

部署流程建议

  1. 将两脚本放在非 Web 可访问目录(如 /opt/scripts/)
  2. 通过 SSH/Cron/部署流水线调用,而非浏览器访问
  3. 部署脚本示例:
#!/bin/bash
# deploy.sh
php /opt/scripts/set_writable.php
git pull / composer install / rsync ...
php /opt/scripts/set_readonly.php

进阶防护:不可变属性 (chattr)

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 0555PHP 脚本写入、WebShell 文件操作SSH/FTP 直接修改、root 权限、inode 绕过
chattr +i所有用户空间写入、rm/mv/echo 重定向物理访问、单用户模式、文件系统损坏修复
WAF/文件监控实时告警、自动恢复零时差攻击、内核级 Rootkit

最佳实践清单

  1. 核心文件只读:index.php, config.php, .htaccess, 框架核心文件
  2. 上传目录 禁止执行:Nginx location ~* \.php$ { deny all; }
  3. 目录权限 0755,文件 0644,敏感文件 0444/0400
  4. 定期扫描:find /var/www -type f -perm /o+w 发现异常可写文件
  5. 结合 Git 版本控制:部署前 git status 检查未跟踪/修改文件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved