配置CSP的script-src导致WordPress站点异常的解决方案咨询
WordPress CSP 安全标头配置解决方案
一、优先采用 Nonce 方案(适配动态脚本场景)
WordPress 大量依赖内联脚本和动态加载的插件脚本,哈希方案会因脚本内容变动(插件更新、主题自定义)频繁失效,Nonce 是更稳定的适配方式:
- 生成并注入 Nonce
在主题的functions.php中添加代码,生成随机 nonce 并注入到 HTTP 头及脚本标签:
function add_csp_nonce() { $nonce = wp_create_nonce('csp-nonce'); // 给前端脚本添加 nonce 属性 add_filter('script_loader_tag', function($tag, $handle) use ($nonce) { if (strpos($tag, 'type="text/javascript"') !== false) { return str_replace('type="text/javascript"', 'type="text/javascript" nonce="' . esc_attr($nonce) . '"', $tag); } return $tag; }, 10, 2); // 输出 CSP 头 header("Content-Security-Policy: upgrade-insecure-requests; script-src 'nonce-$nonce' 'self' www.google-analytics.com ajax.googleapis.com;"); } add_action('wp', 'add_csp_nonce');
注意:需关闭 Security Headers 插件的 CSP 自动生成功能,避免规则冲突。
- 后台脚本适配
WordPress 后台脚本量更大,可单独配置宽松规则过渡,后续再逐步收紧:
function add_admin_csp_nonce() { if (is_admin()) { $nonce = wp_create_nonce('csp-admin-nonce'); header("Content-Security-Policy: script-src 'nonce-$nonce' 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';"); } } add_action('admin_init', 'add_admin_csp_nonce');
二、用 Report-Only 模式调试(避免直接影响站点)
先开启 CSP 报告模式,收集所有被拦截的脚本信息,再逐步调整规则,不会直接导致站点崩溃:
- 配置 Report-Only 头
替换原有 CSP 头为:
Content-Security-Policy-Report-Only: upgrade-insecure-requests; script-src 'self' www.google-analytics.com ajax.googleapis.com; report-uri /csp-report-endpoint/
- 创建报告接收端点
在主题functions.php中添加代码,将拦截日志存入文件:
function csp_report_endpoint() { if ($_SERVER['REQUEST_METHOD'] === 'POST' && strpos($_SERVER['REQUEST_URI'], '/csp-report-endpoint/') !== false) { $report = file_get_contents('php://input'); file_put_contents(WP_CONTENT_DIR . '/csp-reports.log', $report . "\n", FILE_APPEND); http_response_code(204); exit; } } add_action('init', 'csp_report_endpoint');
运行1-2天后,查看 wp-content/csp-reports.log,提取被拦截的脚本域名、哈希,补充到 CSP 规则中。
三、配合 Strict-Dynamic 减少白名单维护
在 CSP 中添加 'strict-dynamic',可让信任脚本加载的动态资源自动被允许,无需逐个添加域名:
Content-Security-Policy: upgrade-insecure-requests; script-src 'nonce-$nonce' 'strict-dynamic' www.google-analytics.com ajax.googleapis.com;
strict-dynamic 会忽略除 nonce/哈希外的域名白名单,只信任已允许脚本加载的资源,大幅降低维护成本。
内容的提问来源于stack exchange,提问作者MacJaffa
相关产品推荐
相关产品推荐

