必须启用mod_headers模块并用Header always set确保CSP覆盖所有响应(含404/500),策略需禁用unsafe-inline、显式配置script-src等指令,子路径须单独强化且后定义策略优先。

要在 Apache 中用 mod_headers 配置 Content-Security-Policy(CSP)来防脚本注入,核心不是“加一句头”,而是确保模块启用、作用域正确、策略严谨且覆盖所有响应状态——尤其不能漏掉 404/500 页面,这些常被攻击者利用。
必须先启用 mod_headers 模块
Apache 默认不加载该模块,即使你写了 Header 指令也不会生效,而且不会报错,这是最常踩的坑。
- Debian/Ubuntu 系统:运行
sudo a2enmod headers,再sudo systemctl restart apache2 - CentOS/RHEL 或 XAMPP:打开
httpd.conf,找到这行:#LoadModule headers_module modules/mod_headers.so
删掉开头的#,保存后重启 Apache - 验证是否启用:
apachectl -M | grep headers,有输出headers_module (shared)才算成功
用 Header always set 覆盖所有响应
只写 Header set 只对 2xx 成功响应生效;而错误页(如 404、500)恰恰容易嵌入恶意脚本。防脚本注入必须让 CSP 在所有状态码下都存在。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- ✅ 正确写法:
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none';" - ❌ 错误写法:
Header set ...—— 错误页将无 CSP 保护 - 注意单引号需成对,分号结尾不能少,空格过多或引号不匹配会导致整条策略被浏览器静默忽略
策略要精简,避免滥用 unsafe-inline
内联脚本(<script>... 或 onclick=)是 XSS 主要入口。除非项目确实依赖,否则不要加 'unsafe-inline'。
- 推荐基础策略:
default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; - 若用 Vue/React 开发服务器(如 localhost:5173),需显式允许:
connect-src 'self' http://localhost:5173; - 禁用插件和外部对象:
object-src 'none'; base-uri 'self';防止<base href>劫持相对路径
子路径或后台区域需单独强化
Apache 不自动继承 CSP 到子路径。比如全局设了宽松策略,/admin 页面仍可能被绕过。
- 在虚拟主机配置中,用
<Location "/admin">包裹更严策略:Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none';" - 如果多个策略共存,后出现的
Header always set会覆盖前面同名头,所以把严格策略放在靠后位置 - 若使用反向代理(如代理到 Node.js 后端),确保代理配置里没有丢弃响应头,必要时用
ProxyPassReverse或显式重设

















