是否对同源域的 ajax 调用进行了预检请求?

Posted

技术标签:

【中文标题】是否对同源域的 ajax 调用进行了预检请求?【英文标题】:Are preflight requests made for ajax call to same origin domain? 【发布时间】:2021-07-12 11:51:44 【问题描述】:

answer 声明,X-Requested-With 标头防止 CSRF 攻击的一种方式是,如果服务器不允许它,那么现代浏览器将不允许 javascript 代码添加此标头。如果标头存在,服务器可以确定该请求不是来自用户可能打开的另一个页面。

据我了解,浏览器确定是否允许在 ajax 请求中使用自定义标头的方式是发出预检请求。然后服务器以标头Access-Control-Allow-Headers 进行响应。其中包含相关请求允许的标头列表。因此,如果服务器返回一个空列表,则 CORS ajax 调用不能存在 xhr 标头。表示不同的来源。

所以我的问题是,如果原点相同,是否会触发预检请求。因为如果是,那么服务器会说不要添加任何标头,如果浏览器不添加任何标头,那么从它自己的来源向服务器发送请求将与另一个来源无法区分。

【问题讨论】:

【参考方案1】:

所以我的问题是,如果原点相同,是否会触发预检请求。

不,不是。

因为如果它们是,那么服务器会说不要添加任何标头,如果浏览器不添加任何标头,那么从它自己的来源向服务器发送的请求将与另一个来源无法区分。

浏览器不发送预检请求并不会阻止服务器测试实际标头请求,如果不存在则抛出错误。

【讨论】:

我的意思是如果发送了预检,那么它会禁止添加任何标头,甚至来自我自己的域/页面的请求也会被阻止添加 xhr 标头。既然你说他们不是,这不会是一个问题。基本上 CORS 会说不要添加任何标头,我的代码将添加 xhr 标头,因此,任何 api 请求都需要具有 xhr 标头,如果没有,那么它是不安全的请求。谢谢。是否有来源验证预检不是为了完整性而触发的 "基本上 CORS 会说不要添加任何标头,而我的代码将添加 xhr 标头,因此,任何 api 请求都需要有 xhr 标头,否则它是不安全的请求。" — 这不会帮助您抵御本质上相同的 CSRF 攻击。 fetch.spec.whatwg.org/#main-fetch — 第 12 步

以上是关于是否对同源域的 ajax 调用进行了预检请求?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2:使用 [Authorize] 对 API 的 Ajax 调用使预检请求失败

跨域的请求在服务端会不会真正执行?

来自 ASP NET Web API 的 CORS 阻止 Ajax POST 调用 - 对预检请求的响应未通过访问控制检查

浏览器预检,后台响应(转载)

为啥跨域 HEAD 请求需要预检?

跨域以及解决跨域的几种方式