CORS(跨域资源共享)来源验证失败

Posted

技术标签:

【中文标题】CORS(跨域资源共享)来源验证失败【英文标题】:CORS (Cross-Origin Resource Sharing) origin validation failure 【发布时间】:2021-11-24 09:42:48 【问题描述】:

最近我为客户做了一个网站。收到后,客户端将站点发送给 acunetix 安全检查,结果返回此警报。

----acunetix 警报--- `访问控制允许来源:https://www.example.com 访问控制允许凭据:true

接受任何来源(任意 Origin 标头值反映在 Access-Control- Allow-Origin 响应标头)。对于 WordPress /wp-json/ 端点,这可能是

预期的行为,需要人工审核。如需更多信息,请 请参阅下面“参考”部分中链接的 WordPress REST API 手册。` --- acunetix 警报结束 ---

我终于找到了它的位置——在rest-api.php

function rest_send_cors_headers( $value ) 
    $origin = get_http_origin();
    if ( $origin ) 
        // Requests from file:// and data: URLs send "Origin: null".
        if ( 'null' !== $origin ) 
            $origin = esc_url_raw( $origin );
        
        header( 'Access-Control-Allow-Origin: ' . $origin );
        header( 'Access-Control-Allow-Methods: OPTIONS, GET, POST, PUT, PATCH, DELETE' );
        header( 'Access-Control-Allow-Credentials: true' );
        header( 'Vary: Origin', false );
     elseif ( ! headers_sent() && 'GET' === $_SERVER['REQUEST_METHOD'] && ! is_user_logged_in() ) 
        header( 'Vary: Origin', false );
    

    return $value;

谁能告诉我在这种情况下我该怎么办?我该如何解决,或者我应该让它成为 wordpress 的做法。 非常感谢您。

【问题讨论】:

【参考方案1】:

function cors()


        if (array_key_exists('HTTP_ORIGIN', $_SERVER)) 
            $origin = $_SERVER['HTTP_ORIGIN'];
         else if (array_key_exists('HTTP_REFERER', $_SERVER)) 
            $origin = $_SERVER['HTTP_REFERER'];
         else 
            $origin = $_SERVER['REMOTE_ADDR'];
        
        $allowed_domains = array(
            'http://localhost:4200',
            'https://x.ir',
            'https://www.x.ir',
        );


        if (in_array($origin, $allowed_domains)) 
            header('Access-Control-Allow-Origin: ' . $origin);
        

        header("Access-Control-Allow-Headers: Origin, X-API-KEY, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Allow-Headers, Authorization, observe, enctype, Content-Length, X-Csrf-Token");
        header("Access-Control-Allow-Methods: GET, PUT, POST, DELETE, PATCH, OPTIONS");
        header("Access-Control-Allow-Credentials: true");
        header("Access-Control-Max-Age: 3600");
        header('content-type: application/json; charset=utf-8');
        $method = $_SERVER['REQUEST_METHOD'];
        if ($method == "OPTIONS") 
            header("HTTP/1.1 200 OK CORS");
            die();
        





【讨论】:

感谢您的回复。我应该用这个替换我的代码吗? 因为当我删除之前在这里发送的代码时,它会显示此错误 REST API 是 WordPress 和其他应用程序与服务器通信的一种方式。一个例子是块编辑器屏幕,它依靠它来显示和保存您的帖子和页面。 REST API 调用给出了以下意外结果:(500) 致命错误:未捕获类型错误:call_user_func_array():参数 #1 ($callback) 必须是有效回调,函数“rest_send_cors_headers " 在 C:\xampp\htdocs\s3\wp-includes\class-wp-hook.php:305 中找不到或无效的函数名 堆栈跟踪:#0 将其用作全局过滤器

以上是关于CORS(跨域资源共享)来源验证失败的主要内容,如果未能解决你的问题,请参考以下文章

跨域资源共享(CORS)

011天之跨域资源共享CORS

跨域资源共享 (CORS) - 我在这里遗漏了啥吗?

跨域资源共享 (CORS) 问题

Amazon S3 CORS(跨域资源共享)和 Firefox 跨域字体加载

阿里云OSS跨域设置配置后不生效