You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置CSP的script-src导致WordPress站点异常的解决方案咨询

WordPress CSP 安全标头配置解决方案

一、优先采用 Nonce 方案(适配动态脚本场景)

WordPress 大量依赖内联脚本和动态加载的插件脚本,哈希方案会因脚本内容变动(插件更新、主题自定义)频繁失效,Nonce 是更稳定的适配方式:

  1. 生成并注入 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 自动生成功能,避免规则冲突。

  1. 后台脚本适配
    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 报告模式,收集所有被拦截的脚本信息,再逐步调整规则,不会直接导致站点崩溃:

  1. 配置 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/
  1. 创建报告接收端点
    在主题 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 14:20:14