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

在 Linux 的 Apache 中配置防跨站请求头,关键不是堆砌一堆头,而是让每个头都生效于所有响应——包括 404、500 这类错误页面,它们常被攻击者利用来绕过防护。
必须启用 mod_headers 并用 Header always set
Apache 默认不加载 mod_headers,即使你写了 Header 指令也不会报错,但实际无效。先确认并启用:
- 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,不能只用 Header set —— 后者对错误响应(如 404)完全不生效
核心防 XSS 头:Content-Security-Policy(CSP)
CSP 是防脚本注入的主力,策略要具体、禁用高风险值:
- 基础推荐:default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'
- 禁用 'unsafe-inline' 和 'unsafe-eval',除非有明确且不可替代的依赖
- 若需内联脚本,改用 nonce 或 sha256-xxx 哈希方式,而非放行全部
- 子路径(如 /admin)需单独强化:用 <Location "/admin"> 包裹更严格策略,后定义的策略会覆盖前面的
配套加固头:X-Content-Type-Options、X-Frame-Options、Referrer-Policy
这些头协同 CSP 构成纵深防御:
- X-Content-Type-Options: nosniff —— 防止浏览器 MIME 嗅探导致 HTML 被误执行为脚本
- X-Frame-Options: SAMEORIGIN 或 DENY —— 防点击劫持,禁止页面被嵌入 iframe
- Referrer-Policy: same-origin —— 跨源导航时不泄露 Referer,保护敏感路径信息
- 所有都加 always:例如 Header always set X-Content-Type-Options "nosniff"
可选但建议关闭的头:X-XSS-Protection
现代浏览器(Chrome 78+、Firefox 95+、Edge 100+)已完全弃用该头:
- 留空或设为 "1" 可能触发旧式“修复”行为,反而易被绕过
- 若无需兼容 IE 或极老 Safari,直接不配;若必须兼容,显式设为 "0"(关闭)更安全
- 真正可靠的防护来自 CSP + 应用层输出编码,不是这个头


















