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

服务器应该如何用它希望拒绝的来源响应CORS请求?,cors,Cors,我在服务器中实现CORS协议,遵循。我的问题是,当服务器希望拒绝某个特定来源时,它应该如何响应 我知道在允许始发地的情况下,如何响应简单和飞行前的请求。但是,如何响应服务器不允许的来源呢?我最初的猜测是不返回任何CORS头,这将导致飞行前请求失败 该标准在第3.2.3节中简要提到了这一点,但听起来它描述的服务器根本不希望参与CORS(与希望参与CORS并允许某些来源,但不允许其他来源的服务器相反): 如果服务器不希望参与CORS协议, 其对CORS或CORS飞行前请求的HTTP响应不得 包括上述

我在服务器中实现CORS协议,遵循。我的问题是,当服务器希望拒绝某个特定来源时,它应该如何响应

我知道在允许始发地的情况下,如何响应简单和飞行前的请求。但是,如何响应服务器不允许的来源呢?我最初的猜测是不返回任何CORS头,这将导致飞行前请求失败

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

如果服务器不希望参与CORS协议, 其对CORS或CORS飞行前请求的HTTP响应不得 包括上述任何标题。建议服务器使用 403此类HTTP响应中的状态

这是响应服务器不允许的来源的正确方法吗?客户机可能会将其误解为“此服务器不允许任何跨源请求”(实际上,问题在于此特定源,而服务器允许其他源)


我知道,但它指的是规范的过时版本,答案似乎并不确定。

CORS在默认情况下是禁用的,因此如果您不希望给定主机获得响应,请不要将它们添加到服务器返回的CORS Access Control Allow Origin头中

访问控制允许来源:

如果主机向您的服务器发出请求,但它们未在此标题中列出,则它们将收到飞行前请求的错误响应

带有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
  }
}
此外,规范中关于飞行前请求错误的重要说明:

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

[a 403错误状态]是响应服务器不允许的来源的正确方式吗?客户机可能会将其误解为“此服务器不允许任何跨源请求”(实际上,问题在于此特定源,而服务器允许其他源)


发送请求脚本可能误解的错误代码没有什么错。这是CORS设计的一部分。为避免混淆浏览器,请确保将标题
Vary:Origin
与响应一起发送。这告诉客户端的浏览器,如果具有不同来源的脚本尝试访问同一资源,它应该再次检查,而不是查找缓存的CORS参数。有关讨论,请参阅。

如果我的回答对您有所帮助,请接受解决方案。感谢这只适用于静态配置。如果这个问题意味着提供一个允许的UI白名单,那么静态配置甚至是不可能的。如果前者属于白名单,则动态响应应响应ACAO中的来源。否则,需要拒绝恶意选项和动作动词请求。