最直接有效的办法是启用mod_headers模块并配置严格的content-security-policy响应头,需确保模块启用、使用header always set覆盖所有状态码、策略禁用unsafe-inline/unsafe-eval、配合mod_security等纵深防护。

最直接有效的办法是启用 mod_headers 模块并配置严格的 Content-Security-Policy(CSP) 响应头,它能从源头禁止非法脚本执行,不依赖前端代码,对所有 HTML、JS、AJAX 请求统一生效。
确保 mod_headers 模块已启用
Apache 默认不加载该模块,即使配置了 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 只作用于 2xx 成功响应;而 404、500 等错误页常被用于反射型 XSS,必须强制注入 CSP。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- ✅ 正确写法(放在
<virtualhost></virtualhost>或主配置中):Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self';" - ⚠️ 注意:外层用双引号包裹整条策略,内部源值用单引号;每条指令以分号结尾;空格或引号不匹配会导致浏览器静默忽略整条策略
策略需精简严谨,避免削弱防护
内联脚本(<script></script> 标签、onclick= 属性)是脚本注入主要入口,不应轻易放行。
- 禁用
'unsafe-inline'和'unsafe-eval',除非项目确实无法重构(如旧版 CMS 后台) - 若需加载 CDN 脚本,显式声明域名:
script-src 'self' https://cdn.example.com; - 管理后台等子路径须单独强化:
在<location></location>块中设置更严策略,并确保该块位置靠后——后定义的同名Header always set会覆盖前面的
配合其他基础防护手段
CSP 是核心防线,但不是唯一手段。建议同步落实:
- 启用
mod_security并加载 OWASP CRS 规则,拦截 SQLi/XSS 类请求体攻击 - 隐藏服务器标识:
ServerTokens Prod+ServerSignature Off - 禁用非必要 HTTP 方法(如 TRACE、PUT、DELETE),用
<limitexcept get post head>Require all denied</limitexcept> - 对用户输入做服务端转义(如 PHP 中用
htmlspecialchars()),不替代 CSP,而是纵深防御










