Web静态资源不可变锁定需四层协同:文件系统设只读+哈希校验;传输层强制HTTPS/HSTS+SRI签名;WAF缓存原始页面并禁自动刷新;运行时禁写函数、路径遍历及eval。
对Web静态资源执行不可变锁定,核心是让文件内容在运行时无法被修改,同时确保访问层返回的永远是原始、可信版本。这不是靠“禁止写入”一个操作就能实现,而是一套包含文件系统控制、传输层保护、缓存策略和网关级校验的组合方案。
一、文件系统级:设置只读权限与完整性校验
静态资源一旦部署完成,就不应再被Web进程或低权限用户写入。
- 将HTML、CSS、JS、图片等资源目录设为操作系统只读:例如Linux下执行chmod -R a-w /var/www/static/,并确保Web服务器(如Nginx)以非root用户运行,无权修改这些文件
- 部署后立即生成并保存所有关键文件的SHA-256哈希值,存于独立安全位置(如配置中心或离线介质),后续可通过脚本定期比对,发现差异即告警
- 禁用FTP、WebDAV等可写协议;若必须提供后台上传功能,务必隔离到单独目录(如/uploads/),与静态发布目录物理分离
二、传输与交付层:启用HTTPS + HSTS + 内容签名
防止中间人篡改或CDN节点被劫持的关键防线。
- 全站强制HTTPS,并在响应头中添加Strict-Transport-Security: max-age=31536000; includeSubDomains,避免HTTP降级攻击
- 对关键静态资源(如main.js、app.css)使用Subresource Integrity(SRI):在HTML中引入时带上integrity属性,浏览器会校验资源哈希是否匹配,不一致则拒绝加载
- 若使用CDN,开启Origin Shield并配置TLS双向认证,确保回源链路可信;同时要求CDN节点仅从受信源站拉取,禁止任意URL回源
三、网关/防护层:WAF网页防篡改规则锁定
借助WAF能力,在流量入口处实现“缓存即权威”的交付模式。
- 在WAF控制台为敏感路径(如/index.html、/about.html)启用网页防篡改功能,WAF会主动抓取并缓存原始页面及其关联资源(CSS/JS/图片)
- 配置生效后,所有对该路径的请求,WAF不再转发至源站,而是直接返回已缓存的干净副本——即使源站文件已被黑客替换,用户看到的仍是原始内容
- 注意:需确保WAF缓存刷新机制可控,仅允许运维通过审批流程手动更新,禁用自动过期或爬虫触发式刷新
四、运行时加固:禁止动态写入与禁用危险函数
堵住应用自身可能引入的篡改通道。
- 在PHP中禁用file_put_contents、fwrite等写文件函数;在Node.js中限制fs.writeFile对静态目录的写入权限
- 禁用服务端模板引擎的任意文件包含(如PHP的include($_GET['page'])),避免路径遍历导致覆盖静态文件
- 前端构建产物(如Vue CLI或Webpack输出)应禁用eval、Function构造器,并开启CSP策略:script-src 'self',阻止内联脚本和外部恶意JS执行