服务器应如何响应其希望拒绝的来源的 CORS 请求?

Cha*_*had 5 cors

我正在服务器内实现 CORS 协议,遵循CORS 标准。我的问题是当服务器希望拒绝特定来源时应如何响应。

我了解在允许来源时如何响应简单的预检请求。但是对于那些服务器不允许的 Origin 如何响应呢?我最初的猜测只是不返回任何 CORS 标头,这会导致预检请求失败(如所需)。

该标准在第 3.2.3 节中简要提到了这一点,但听起来它描述的是根本不希望参与 CORS 的服务器(与想要参与 CORS 并允许某些来源但不允许其他来源的服务器相反) ):

如果服务器不希望参与 CORS 协议,则其对 CORS 或 CORS 预检请求的 HTTP 响应不得包含任何上述标头。鼓励服务器在此类 HTTP 响应中使用 403 状态。

这是响应服务器不允许的来源的正确方法吗?客户端似乎可能会误解为“该服务器不允许任何跨源请求”(实际上,问题出在这个特定的源上,并且服务器将允许其他源)。

我知道这个问题,但它指的是规范的过时版本,答案似乎并不明确。

Dan*_*iel 0

CORS 默认情况下处于禁用状态,因此如果您不希望给定主机获取响应,请勿将它们添加到服务器返回的 CORS Access-Control-Allow-Origin 标头中

访问控制允许来源:https: //www.example.com

如果主机向您的服务器发出请求,但它们未在此标头中列出,则它们将收到有关其预检请求的错误响应。

使用 CORS 的 nginx 配置示例如下所示

server {
  listen        80;
  server_name   api.example.com;

  location / {

    # Simple requests
    if ($request_method ~* "(GET|POST)") {
      add_header "Access-Control-Allow-Origin" "https://example.com";
    }

    # Preflighted requests
    if ($request_method = OPTIONS) {
      add_header "Access-Control-Allow-Origin"  "https://example.com";
      add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
      add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
      return 200;
    }

    # Handle request
  }
}
Run Code Online (Sandbox Code Playgroud)

另外,规范中关于预检请求错误的重要说明:

CORS 失败会导致错误,但出于安全原因,JavaScript 代码无法获取有关错误原因的详细信息。所有代码都知道发生了错误。确定具体问题的唯一方法是查看浏览器的控制台以获取详细信息。

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS