在 Apache 中启用 CSP 必须通过 mod_headers 模块配置 Header always set,确保覆盖所有响应状态码;需启用模块、避免 .htaccess、配合其他安全头及 HTTPS 的 HSTS 使用。

在 Apache 中启用 Content-Security-Policy(CSP)必须通过 mod_headers 模块注入响应头,且不能只依赖后端或 HTML meta 标签——只有服务器级 HTTP 头才能覆盖所有响应状态码(包括 404、500、重定向等),真正起防护作用。
确认并启用 mod_headers 模块
phpEnv 等 Windows 集成环境默认不启用该模块,直接写 Header 指令会报错:Invalid command 'Header', perhaps misspelled or defined by a module not included...
- 打开
Apache\conf\httpd.conf - 搜索
#LoadModule headers_module,去掉行首的# - 检查路径是否匹配,常见形式为:
LoadModule headers_module modules/mod_headers.so或libexec/mod_headers.so - 保存后重启 Apache;若提示文件不存在,说明当前 phpEnv 版本精简了模块,需换用完整版 Apache
用 Header always set 写入 CSP 策略
仅用 Header set 会在 404、500、301 等非 2xx 响应中失效,而攻击者常利用错误页注入 XSS。必须使用 always 关键字确保策略强制生效:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在
httpd.conf文件末尾(或新建conf/extra/security-headers.conf并用Include加载)添加: Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'; frame-ancestors 'none'; base-uri 'self'; form-action 'self';"- 如已存在旧 CSP,先加一行
Header unset Content-Security-Policy再 set,避免冲突 - 不要写在
<VirtualHost>内部——除非你只要单站点生效;全局防护必须放在主配置作用域
避免常见配置陷阱
CSP 容易因配置位置或语法问题完全不生效,尤其在 phpEnv 这类封装环境中:
-
.htaccess基本无效:phpEnv 默认禁用AllowOverride All,且错误页、重定向、静态资源不走 .htaccess - 别用
Header set替代Header always set:前者跳过非 2xx 响应,等于给攻击者留后门 - 策略值要贴合实际资源:比如用了 CDN 图片,
img-src就得加上对应域名;否则页面白屏、功能异常 - 开发阶段建议先加
; report-uri /csp-report或report-to收集违规日志,再逐步收紧策略
搭配其他关键安全头一起启用
CSP 是核心,但需配合其他头形成纵深防御:
-
Header always set X-Content-Type-Options "nosniff"—— 阻止 MIME 嗅探 -
Header always set X-Frame-Options "DENY"或"SAMEORIGIN"—— 防点击劫持 -
Header always set X-XSS-Protection "1; mode=block"—— 辅助 XSS 过滤(现代浏览器已弱化,但仍建议保留) - HTTPS 环境下务必加
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

















