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

Apache 通过 httpd.conf 配置 CSP 防御脚本注入,关键不是加一条头就完事,而是确保模块启用、策略生效范围全覆盖、指令写法无误、策略本身能真正阻断内联和外部恶意脚本。
确认 mod_headers 模块已启用
Header 指令不会自动生效——模块未加载时,所有配置静默失效,且 Apache 不报错。
- Debian/Ubuntu 系统:运行
sudo a2enmod headers && sudo systemctl restart apache2 - RHEL/CentOS/XAMPP:编辑
httpd.conf,取消注释这行:LoadModule headers_module modules/mod_headers.so - 验证是否成功:执行
apachectl -M | grep headers,输出含headers_module (shared)才算启用
用 Header always set 写入 CSP 响应头
只写 Header set 仅作用于 2xx 成功响应;而 404、500 等错误页常含用户输入,是 XSS 高发区,必须强制覆盖所有状态码。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- ✅ 正确写法(放在
<VirtualHost>或全局配置段中):Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self';" - ⚠️ 注意引号配对、分号结尾、空格不可多余;单引号必须成对,否则整条策略被浏览器忽略
- 若同时启用 HTTPS,建议追加 HSTS:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
策略要精简务实,避免 unsafe-inline
内联脚本(<script> 标签或 onclick=)是 XSS 主要入口。除非项目强依赖,否则不要加 'unsafe-inline'。
- 基础推荐策略:
default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; - 若前端开发服务跑在
localhost:5173,需显式允许:connect-src 'self' http://localhost:5173; - 禁用插件与外部对象:
object-src 'none'可防 Flash/Java 插件劫持;base-uri 'self'防止<base href>被篡改
子路径或管理后台需单独强化策略
Apache 不自动继承 CSP 到子路径。比如全局策略较宽松,/admin 页面仍可能被绕过。
- 在
<VirtualHost>中添加位置块:<Location "/admin"><br> Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self';"<br></Location>
- 多个
Header always set共存时,后定义的策略会覆盖前面同名头(如重复设置 CSP),所以把更严策略放后面更稳妥

















