当当前用户禁止连接点时,我的服务器是否应该为 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 2xx
对 OPTIONS
请求的成功响应。但是,如果您的服务器 没有 return 一个 2xx
用于 OPTIONS
对特定 URL 请求的 2xx
,那么 CORS 预检 OPTIONS
对 URL 的请求将失败。因此,如果那是您实际上 想要 发生的情况,那么用 403
响应就可以了——用 405
或 501
或任何其他响应代码可能具有适合您的特定情况的含义。
但请务必记住,CORS 协议要求浏览器绝不能将身份验证凭据作为 CORS 预检 OPTIONS
请求的一部分发送。因此,如果您的服务器配置为需要身份验证才能使 OPTIONS
请求产生 2xx
成功响应,那么来自浏览器的所有 CORS 预检将在 100% 的时间内失败。换句话说,您将确保所有从浏览器中的前端 JavaScript 代码 运行 到达服务器并添加自定义响应 headers(例如,Content-Type
或 Authorization
headers) 等触发预检。
我不知道用 2xx
响应未经身份验证的 OPTIONS
请求(来自不允许的用户)可能会出现任何特定的安全漏洞。这不允许用户从您的服务器获取任何信息,除了您有意选择放入您为响应 OPTIONS
请求而发送的响应 headers 中的任何信息。当然,它不会阻止您要求对 GET
或 POST
或任何其他方法进行身份验证。但就 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 规范还没有被明确标记为过时,但我会尽快确保它被标记为过时。
阅读各种文档(例如 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 2xx
对 OPTIONS
请求的成功响应。但是,如果您的服务器 没有 return 一个 2xx
用于 OPTIONS
对特定 URL 请求的 2xx
,那么 CORS 预检 OPTIONS
对 URL 的请求将失败。因此,如果那是您实际上 想要 发生的情况,那么用 403
响应就可以了——用 405
或 501
或任何其他响应代码可能具有适合您的特定情况的含义。
但请务必记住,CORS 协议要求浏览器绝不能将身份验证凭据作为 CORS 预检 OPTIONS
请求的一部分发送。因此,如果您的服务器配置为需要身份验证才能使 OPTIONS
请求产生 2xx
成功响应,那么来自浏览器的所有 CORS 预检将在 100% 的时间内失败。换句话说,您将确保所有从浏览器中的前端 JavaScript 代码 运行 到达服务器并添加自定义响应 headers(例如,Content-Type
或 Authorization
headers) 等触发预检。
我不知道用 2xx
响应未经身份验证的 OPTIONS
请求(来自不允许的用户)可能会出现任何特定的安全漏洞。这不允许用户从您的服务器获取任何信息,除了您有意选择放入您为响应 OPTIONS
请求而发送的响应 headers 中的任何信息。当然,它不会阻止您要求对 GET
或 POST
或任何其他方法进行身份验证。但就 CORS 协议而言,这是您的服务器指示其允许来自前端 JavaScript.
另请注意: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 规范还没有被明确标记为过时,但我会尽快确保它被标记为过时。