当当前用户禁止连接点时,我的服务器是不是应该为 HTTP OPTIONS 方法返回 200?
Posted
技术标签:
【中文标题】当当前用户禁止连接点时,我的服务器是不是应该为 HTTP OPTIONS 方法返回 200?【英文标题】:Is my server expected to return a 200 for an HTTP OPTIONS methods when the connection point is forbidden to the current user?当当前用户禁止连接点时,我的服务器是否应该为 HTTP OPTIONS 方法返回 200? 【发布时间】:2019-06-22 04:59:11 【问题描述】:阅读各种文档(例如w3c CORS),我不得不说OPTIONS
似乎根本没有很好的文档记录。
我想知道我的 REST 服务器是否正确,如果客户端尝试访问被禁止的连接点,它会返回 403(它是否存在甚至并不总是很重要,尽管有时服务器可能会返回 404。)
不过,OPTIONS
文档似乎并没有推断出这样的返回码是有效的。
我发现this *** Q/A 接受的答案似乎表明我们可以返回任何错误代码。
我想在不允许用户的情况下允许OPTIONS
通过会是一个安全漏洞。同时,OPTIONS
定义了 Access-Control-Allow-Credentials
标头,如果我在此类连接点上返回 403,我看不出如何使该标头有用。 (换句话说,对我来说这听起来很矛盾。)
【问题讨论】:
实际上,如果我一路检测到 403,我可以在那时生成Access-Control-Allow-Credentials
标头。
【参考方案1】:
简短回答:如果您确实希望 OPTIONS 响应对启用 CORS 的服务器有用,那么您不应仅仅因为用户未登录而返回 403。
详情:
服务器为OPTIONS
请求返回403
绝不是无效的。 CORS 协议不要求您的服务器为 OPTIONS
请求返回 2xx
成功响应。但是,如果您的服务器没有为对特定 URL 的 OPTIONS
请求返回 2xx
,则对该 URL 的 CORS 预检 OPTIONS
请求将失败。因此,如果这是您真正想要发生的事情,那么使用 403
进行响应就可以了 - 使用 405
或 501
或任何其他可能具有适当含义的响应代码进行响应也是如此根据您的具体情况。
但请务必记住,CORS 协议要求浏览器永远不要将身份验证凭据作为 CORS 预检 OPTIONS
请求的一部分发送。因此,如果您的服务器配置为要求身份验证以使 OPTIONS
请求产生 2xx
成功响应,那么来自浏览器的所有 CORS 预检将在 100% 的时间内失败。换句话说,您将确保所有从浏览器中运行的前端 javascript 代码到达服务器并添加自定义响应标头(例如,Content-Type
或 Authorization
标头)的请求都将失败,以便触发预检。
我不知道通过使用2xx
响应未经身份验证的OPTIONS
请求(来自不允许的用户)可能会出现任何特定的安全漏洞。除了您为响应OPTIONS
请求而发送的响应标头中有意选择放入的任何信息之外,这不允许用户从您的服务器获取任何信息。当然,它不会阻止您要求对 GET
或 POST
或任何其他方法进行身份验证。但就 CORS 协议而言,它是您的服务器在来自前端 JavaScript 的请求中指示它允许哪些方法和请求标头的唯一方法。
另请注意:当前积极维护的 CORS 要求在 Fetch 规范 https://fetch.spec.whatwg.org 中定义。 https://w3.org/TR/cors 规范已过时,不再维护,不应用于任何事情(请参阅https://w3.org/2017/08/16-webappsec-minutes.html#item03 和https://***.com/a/45926657/441757 的答案)。
我不知道为什么 https://w3.org/TR/cors 规范还没有被明确标记为过时,但我会尽量确保它尽快被标记为过时。
【讨论】:
是的,祝你那发生。最后我听说(来自@annevk),W3 上没有人会费心将它标记为过时,所以它就放在那里。请注意,我认为 W3 文档在某些方面更适合前端开发人员 - Fetch 规范实际上是为浏览器开发人员编写的......以上是关于当当前用户禁止连接点时,我的服务器是不是应该为 HTTP OPTIONS 方法返回 200?的主要内容,如果未能解决你的问题,请参考以下文章
当当前页面不是第一页时,ViewPager在旋转屏幕后有错误的偏移数据
phpunit,laravel:当当前类范围没有父级时不能使用“父级”