当当前用户禁止连接点时,我的服务器是否应该为 HTTP OPTIONS 方法 return 200?

Is my server expected to return a 200 for an HTTP OPTIONS methods when the connection point is forbidden to the current user?

阅读各种文档(例如 w3c CORS),我不得不说 OPTIONS 似乎根本没有很好的文档记录。

我想知道我的 REST 服务器是否正确,如果客户端试图访问一个被禁止的连接点(无论它是否存在甚至不总是很重要,尽管有时服务器可能 return 404。)

不过,OPTIONS 文档似乎并未推断出这样的 return 代码是有效的。

我发现 this Whosebug Q/A 已接受的答案似乎表明我们可以 return 任何错误代码。

我认为在不允许用户的情况下允许 OPTIONS 通过将是一个安全漏洞。同时,OPTIONS 定义了 Access-Control-Allow-Credentials header,如果我 return 一个 403,我不明白我怎么能让 header 有用在这样的连接点上。 (换句话说,对我来说这听起来很矛盾。)

简短回答:如果您确实希望 OPTIONS 响应对 CORS-enabling 服务器有用,那么您不应该仅仅因为用户未登录就 return 403 .

详情:

服务器对 OPTIONS 请求 return 一个 403 永远不会无效。 CORS 协议不要求您的服务器 return 2xxOPTIONS 请求的成功响应。但是,如果您的服务器 没有 return 一个 2xx 用于 OPTIONS 对特定 URL 请求的 2xx,那么 CORS 预检 OPTIONS 对 URL 的请求将失败。因此,如果那是您实际上 想要 发生的情况,那么用 403 响应就可以了——用 405501 或任何其他响应代码可能具有适合您的特定情况的含义。

但请务必记住,CORS 协议要求浏览器绝不能将身份验证凭据作为 CORS 预检 OPTIONS 请求的一部分发送。因此,如果您的服务器配置为需要身份验证才能使 OPTIONS 请求产生 2xx 成功响应,那么来自浏览器的所有 CORS 预检将在 100% 的时间内失败。换句话说,您将确保所有从浏览器中的前端 JavaScript 代码 运行 到达服务器并添加自定义响应 headers(例如,Content-TypeAuthorization headers) 等触发预检。

我不知道用 2xx 响应未经身份验证的 OPTIONS 请求(来自不允许的用户)可能会出现任何特定的安全漏洞。这不允许用户从您的服务器获取任何信息,除了您有意选择放入您为响应 OPTIONS 请求而发送的响应 headers 中的任何信息。当然,它不会阻止您要求对 GETPOST 或任何其他方法进行身份验证。但就 CORS 协议而言,这是您的服务器指示其允许来自前端 JavaScript.

的请求的方法和请求的唯一方法 headers

另请注意:CORS 的当前 actively-maintained 要求在 Fetch 规范 https://fetch.spec.whatwg.org. The https://w3.org/TR/cors spec is obsolete and no longer maintained and shouldn’t be used for anything (see https://w3.org/2017/08/16-webappsec-minutes.html#item03 and the answer at https://whosebug.com/a/45926657/441757) 中定义。

我不知道为什么 https://w3.org/TR/cors 规范还没有被明确标记为过时,但我会尽快确保它被标记为过时。