在阅读了很多有关CORS和飞行前的请求之后,我仍然不太明白为什么进行飞行前会有一些例外。Content-Type是'text / plain'还是'application / json'为什么有关系?
如果我做对了,那么CORS的价值就是限制返回的数据(它不在乎POST是否破坏了数据库,它只在乎浏览器无法读取该操作的输出)。但是,如果这是真的(可能不是),那么为什么会有飞行前要求呢?仅仅在响应中检查“ Access-Control-Allow-Cross-Origin-Request:true”之类的标题就不够了吗?
到目前为止,我在以下方面找到了最好的答案:CORS-引入飞行前请求的动机是什么?问题,但这仍然让我感到困惑。
Content-Type是'text / plain'还是'application / json'为什么有关系?
表单支持的三种内容类型(enctype
)如下:
application/x-www-form-urlencoded
multipart/form-data
text/plain
如果表单是由Web服务器上的处理程序接收的,并且不是上述内容类型之一,则可以假定发送该表单的是AJAX请求,而不是HTML<form />
标记。
因此,如果现有的pre-CORS之前的系统使用内容类型作为确保请求不是跨站点的方法,以防止跨站点请求伪造(CSRF),那么CORS规范的作者就不希望将任何新的安全漏洞引入现有网站。为此,他们坚持要求此类请求启动预检,以确保浏览器和服务器首先兼容CORS。
不管POST是否破坏了数据库,它只关心浏览器不能读取该操作的输出
非常正确。默认情况下,浏览器遵循“相同来源策略”。CORS放宽了此限制,允许另一个Origin读取AJAX做出的响应。
为什么根本有飞行前要求?
如前所述,要确保客户端和服务器都与CORS兼容,并且不仅要发送HTML表单,而且始终可以跨域提交。
例如,这一直有效。example.com
张贴至example.org
以下表格:
<form method="post" action="//example.org/handler.php" />
仅仅在响应中检查“ Access-Control-Allow-Cross-Origin-Request:true”之类的标题就不够了吗?
由于CSRF向量。通过检查浏览器是否可以发送预检,它可以确保跨域请求在浏览器发送之前得到授权(通过检查CORS响应标头)。这样一来,浏览器就可以保护当前用户的会话-请记住,此处的攻击者不是运行该浏览器的攻击者,受害者是通过CSRF攻击运行该浏览器的,因此,这种可操纵的浏览器无法正确检查CORS标头或欺骗性内容。预检对于攻击者运行自己没有任何好处。同样,预检可以使CSRF缓解措施(例如自定义标头)起作用。
总结一下:
enctype
的<form>
提交的所有内容都是标准的(或者像CORS所说的那样“简单”)本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句