阅读各种文档(如w3c CORS),我不得不说,OPTIONS似乎没有那么好的文档化。
我想知道我的REST服务器是否做对了,如果客户机试图访问一个被禁止的连接点(它是否存在甚至并不总是重要的,尽管有时服务器可能返回404 ),它返回一个403。
然而,OPTIONS文档似乎并不能推断出这样的返回代码是有效的。
我找到了这个堆叠溢出Q/A,其中公认的答案似乎表明我们可以返回任何错误代码。
我可以想象,当用户不被允许时,允许OPTIONS通过是一个安全漏洞。同时,OPTIONS定义了Access-Control-Allow-Credentials头,如果我在这样的连接点上返回一个403,我就无法让这个头有用。(换句话说,对我来说,这听起来很矛盾。)
发布于 2019-01-29 11:14:32
简短的回答:如果您确实希望选项响应在CORS(启用服务器)方面是有用的,那么您不应该仅仅因为用户没有登录就返回403。
详细信息:
对于服务器来说,返回403请求的OPTIONS从来都不是无效的。CORS协议不要求服务器为OPTIONS请求返回OPTIONS成功响应。但是,如果您的服务器没有将2xx的OPTIONS请求返回到特定的URL,那么对该OPTIONS的预飞OPTIONS请求就会失败。因此,如果这是您真正希望发生的事情,那么使用403进行响应是可以的--使用405或501或任何其他响应代码可能具有适合您的特定情况的含义也是如此。
但是要记住,CORS协议要求浏览器永远不要将身份验证凭据作为CORS飞行前OPTIONS请求的一部分发送。因此,如果您的服务器被配置为需要身份验证才能使OPTIONS请求生成2xx成功响应,那么来自浏览器的所有CORS预飞都会100%失败。换句话说,您将确保从运行在浏览器中的前端JavaScript代码向服务器发出的所有请求都将失败,并添加自定义响应头(例如,Content-Type或Authorization报头),从而触发预飞。
我不知道通过2xx响应未经身份验证的OPTIONS请求(来自不允许的用户)可能会出现任何特定的安全漏洞。这不允许用户从服务器获取任何信息,除非您有意选择将其放入响应OPTIONS请求的响应头中。当然,它并不阻止您要求对GET或POST或其他任何方法进行身份验证。但是就CORS协议而言,这是服务器在来自前端JavaScript的请求中指示允许哪些方法和请求头的唯一方法。
还要注意:当前主动维护的CORS需求在获取规范https://fetch.spec.whatwg.org中定义。https://w3.org/TR/cors规范已经过时,不再维护,不应该用于任何事情(参见https://w3.org/2017/08/16-webappsec-minutes.html#item03和https://stackoverflow.com/a/45926657/441757的答案)。
我不知道为什么https://w3.org/TR/cors规范没有被清楚地标记为过时,但我将努力确保它很快就被标记为过时。
https://stackoverflow.com/questions/54414734
复制相似问题