WordPress站点Acunetix检测出CORS origin验证失败该如何处理?
先明确判断标准:按需选择是否修改
你不需要直接默认保留或者强行修改,先确认你的站点是否有跨域调用WordPress REST API的实际需求即可:
- 如果你的站点有前后端分离部署、第三方业务系统合法调用/wp-json接口的需求,且所有鉴权接口都做了严格的权限校验,这个Acunetix告警属于可忽略的预期配置,不需要做修改
- 如果你的站点完全没有跨域调用REST API的需求,或者只需要给少数指定域名开跨域权限,建议修改配置消除安全风险
修复注意事项
不要直接修改WordPress核心文件rest-api.php,后续WordPress版本更新会直接覆盖你修改的内容,正确的做法是用WordPress自带的钩子逻辑,在当前主题的functions.php文件中新增代码覆盖默认配置即可。
场景1:完全禁止跨域调用REST API(只允许同域调用)
添加如下代码:
add_filter('rest_pre_serve_request', function($value) { // 提前移除默认的CORS响应头生成逻辑 remove_action('rest_pre_serve_request', 'rest_send_cors_headers'); $site_origin = get_site_url(); $request_origin = get_http_origin(); // 仅同域请求返回跨域头 if ($request_origin && $request_origin === $site_origin) { header('Access-Control-Allow-Origin: ' . $site_origin); header('Access-Control-Allow-Methods: OPTIONS, GET, POST, PUT, PATCH, DELETE'); header('Access-Control-Allow-Credentials: true'); header('Vary: Origin'); } return $value; }, 9);
场景2:仅允许指定域名跨域调用
添加如下代码,按需修改白名单列表即可:
add_filter('rest_pre_serve_request', function($value) { remove_action('rest_pre_serve_request', 'rest_send_cors_headers'); // 可跨域调用的域名白名单 $allow_origins = [ 'https://www.your-business-domain.com', 'https://app.your-domain.com' ]; $request_origin = get_http_origin(); if ($request_origin && in_array($request_origin, $allow_origins)) { header('Access-Control-Allow-Origin: ' . $request_origin); header('Access-Control-Allow-Methods: OPTIONS, GET, POST, PUT, PATCH, DELETE'); header('Access-Control-Allow-Credentials: true'); header('Vary: Origin'); } return $value; }, 9);
配置验证方法
修改完成后可以用curl命令验证是否生效,模拟非白名单域名的请求:curl -I -H "Origin: https://test-unauthorized-domain.com" https://你的站点域名/wp-json/wp/v2/posts
如果返回的响应头中没有Access-Control-Allow-Origin字段,或者返回的是你白名单内的域名,就说明配置生效。
内容的提问来源于stack exchange,提问作者Glauk Abazi
相关产品推荐
相关产品推荐

