无法从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
相关产品推荐
相关产品推荐

