最有效的网页防篡改手段是系统级只读权限配置。Linux用chattr +i锁定核心文件,Windows通过NTFS高级权限仅授予IIS_IUSRS读取权限,并需分离静态与动态目录、部署时自动加固、运行前校验可写性。直接给关键目录设只读,是防网页篡改最基础也最有效的手段之一。但要注意:**只读 ≠ 不能改**,必须区分“文件属性只读”和“系统级权限只读”,后者才真正起作用。实际中常因忽略权限继承、所有者限制或运行时写需求,导致网站崩掉或防护失效。
对静态资源目录(如 /www/wwwroot/example.com/html)或配置文件(如 /etc/nginx/conf.d/site.conf),推荐用 chattr +i —— 这是内核级不可修改标记,连 root 都无法覆盖或删除,除非先 chattr -i。
chattr -R +i /www/wwwroot/example.com/html
chattr -R -i /www/wwwroot/example.com/html/uploadschattr -R -i /www/wwwroot/example.com/html/cache
lsattr /www/wwwroot/example.com/html/index.html → 应显示 ----i---------
⚠️ 注意:PHP 或 Node.js 进程若以 root 运行,+i 会彻底阻断所有写操作;务必确保上传、会话、日志等路径不在锁定范围内,否则服务异常。
仅勾选“只读”属性毫无防护力——它只是个提示位。必须进 安全 → 高级 → 禁用继承 → 删除所有继承权限 → 新增用户组并仅赋予读取权限。
✅ 效果:IIS 工作进程能读代码、执行 PHP/ASP.NET,但无法修改 .html/.js/.config 文件,也无法新建或删除任何文件。
只读不是一劳永逸。关键在于划分“静态资产”和“运行时数据”,并在部署流程中固化权限策略。
/public、/static、/themes 设为只读;而 /storage、/runtime、/uploads 单独挂载、赋写权限find ./public -type f -exec chmod 444 {} ;chattr -R +i ./public
index.php 或 Node.js 的 app.js 开头加检测:if (!is_writable(__DIR__.'/storage')) { die('Critical: storage dir not writable'); }
不复杂但容易忽略:真正的只读保护,从来不是单点操作,而是目录规划 + 权限配置 + 运行时校验的组合动作。