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

无法从report-uri获取CSP报告请求体,WordPress下如何处理?

解决CSP违规报告请求体获取与写入文件问题

你不需要依赖REST API,直接修改现有端点文件就能实现需求,也可以通过规范的WordPress REST API方案处理,两种方法如下:

方法一:直接修改根目录csp-endpoint文件

浏览器发送的是POST请求,请求体为JSON格式的application/csp-report,直接修改该文件即可读取请求体并写入日志:

<?php
// 仅处理POST请求
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('HTTP/1.1 405 Method Not Allowed');
    exit;
}

// 读取原始请求体
$request_body = file_get_contents('php://input');
if (empty($request_body)) {
    header('HTTP/1.1 400 Bad Request');
    exit;
}

// 验证JSON格式(可选)
$csp_report = json_decode($request_body, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    header('HTTP/1.1 400 Bad Request');
    exit;
}

// 写入到csp-report文件(追加模式,加锁避免写入冲突)
$log_file = __DIR__ . '/csp-report';
file_put_contents(
    $log_file,
    date('Y-m-d H:i:s') . ' - ' . $request_body . PHP_EOL,
    FILE_APPEND | LOCK_EX
);

// 返回204 No Content(符合CSP报告规范,无需返回内容)
header('HTTP/1.1 204 No Content');
// 如需保留Report-To头,取消下方注释
// header("Report-To: {\"group\": \"csp-endpoint\", \"max_age\": 10886400, \"endpoints\": [{\"url\": \"http://localhost:8888/wordpress/csp-endpoint\"}]}");
exit;

方法二:通过WordPress REST API规范处理

之前的错误在于使用了GET方法,且回调函数错误发起了自请求,以下是正确的REST API实现:

1. 注册POST类型的REST路由

function register_csp_report_route() {
    register_rest_route(
        'csp/v1',
        '/report-endpoint',
        array(
            'methods' => WP_REST_Server::CREATABLE, // 对应POST请求
            'callback' => 'handle_csp_report',
            'permission_callback' => '__return_true', // 允许所有来源提交报告
        )
    );
}
add_action('rest_api_init', 'register_csp_report_route');

2. 编写报告处理回调函数

function handle_csp_report(WP_REST_Request $request) {
    // 获取自动解析后的JSON请求体
    $csp_data = $request->get_json_params();
    
    if (empty($csp_data['csp-report'])) {
        return new WP_Error('invalid_report', '无效的CSP报告', array('status' => 400));
    }

    // 写入日志文件
    $log_file = ABSPATH . '/csp-report';
    $log_entry = date('Y-m-d H:i:s') . ' - ' . json_encode($csp_data) . PHP_EOL;
    file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX);

    // 返回204无内容响应
    return new WP_REST_Response(null, 204);
}

3. 更新CSP头配置

将原report-uri指向新的REST端点:

function add_csp_header() {
    header("Content-Security-Policy-Report-Only: 
    report-uri " . get_rest_url(null, 'csp/v1/report-endpoint') . ";
    script-src 'self'");
}
add_action('send_headers', 'add_csp_header', 10);

方法选择

  • 直接修改csp-endpoint文件更轻量化,无需依赖WordPress内部机制,适合快速实现。
  • 使用REST API更符合WordPress开发规范,便于后续扩展(如报告验证、数据库存储等)。

内容的提问来源于stack exchange,提问作者timholz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:48:14