如何处理无效的 CORS 预检请求?

Posted

技术标签:

【中文标题】如何处理无效的 CORS 预检请求?【英文标题】:How to handle an invalid CORS preflight request? 【发布时间】:2016-02-17 18:30:54 【问题描述】:

假设有一个 CORS 预检请求进入,但它为一个或多个 Access-Control-Request-* 标头指定了不受支持的值。服务器应该如何将此信息传回给浏览器?

一些例子:

浏览器使用Access-Control-Request-Method: PUT 发送预检请求,但服务器不允许对指定资源的 PUT 请求。 浏览器使用Access-Control-Request-Headers: X-PINGOTHER 发送预检请求,但服务器不允许/理解该标头。

我能找到的唯一线索位于W3C documentation,这表明如果预检响应出现问题,服务器应该“终止此请求”,但我不确定实际情况如何(服务器真的应该终止连接而不发回响应吗??)。

或者,服务器是否根本不需要验证,因为浏览器只需检查 Access-Control-Allow-* 响应标头就知道它做错了什么?

【问题讨论】:

【参考方案1】:

Tomcat's CORS Filter 在收到无效的 CORS 预检请求时返回 403 响应:

如果请求无效或不允许,则请求被拒绝,HTTP 状态代码为 403(禁止)。有一个flowchart 演示了此过滤器处理请求。

当然,文档没有解释为什么这样做,但至少它可以作为一个起点。

【讨论】:

以上是关于如何处理无效的 CORS 预检请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理预检请求?

Cors - 如何处理需要自定义标头的预检选项请求? (AWS:使用 vpc 端点的私有 API 网关)

如何处理从 servlet 中的 Angular 应用程序发送的预检请求?

为啥经过身份验证的 CORS 请求的预检 OPTIONS 请求在 Chrome 中有效,但在 Firefox 中无效?

如何处理 Spring Boot、AngularJS 应用程序中的 CORS 错误?

CORS 问题:预检响应具有无效的 HTTP 状态代码 403