如何识别 CORS 预检请求?

How can I identify a CORS preflight request?

一个 CORS 预检请求显然使用了 OPTIONS 方法并且有一个 Origin header。但是,浏览器可以决定为 任何 HTTP 请求添加来源 header。此外,OPTIONS 可用于 CORS 以外的其他功能。 (如何)我可以准确地(没有误报或误报)识别请求是否是 CORS 预检请求?

检查 Access-Control-Request-Method header。在预检请求以外的请求中发送它没有多大意义。

检查预检请求中是否存在这些基本信息:

  1. 请求的 HTTP 方法是 OPTIONS
  2. 它有一个 Origin header
  3. 它有一个 Access-Control-Request-Method header,表明它试图用来消耗你的 service/resource
  4. 的实际方法是什么

注意事项

从理论上讲,您可能非常聪明,可以手动设置那些 header 并出于某种原因尝试提出一些 fake-Preflight 请求。

但是,您的浏览器会报错并显示以下示例消息: Refused to set unsafe header "Origin"(在 Chrome 上作为 XHR 请求进行测试) 而其他应用程序(例如 Postman)会将自己的 Origin 设置为 Origin: chrome://extension...