17

CORS 规范没有说明服务器应如何响应无效的 CORS 请求。例如,如果请求 Origin 无效,则CORS 规范声明:“终止这组步骤。请求超出了本规范的范围。” 其他错误情况也有类似的语言,例如请求无效的方法或标头。

如果出现 CORS 错误,预期的响应应该是什么?我了解不同的服务器可能需要不同的行为。但我正在寻找一个标准响应或如果服务器所有者不在乎的话可以接受的响应。

4

3 回答 3

25

是的,我意识到我正在回答我自己的问题,但无论如何它都在这里。我对此进行了一些研究,似乎行为分为两个阵营:

1) 如果 CORS 请求无效,则返回错误。这是Java CORS 过滤器项目采用的路线。这个库返回

  • 400 Bad Request 不符合规范的请求
  • 403 Forbidden for invalid origins 或 headers。
  • 405 Method Not Allow for invalid方法

2)在响应中返回 CORS 头,让浏览器整理访问细节。这似乎是更常见的方法,并且被用于 Amazon S3、SoundCloud、FourSquare 和 Spotify 的 API 使用(后两个 API 受益于仅支持简单的 CORS 请求)。在这种情况下,服务器不做任何错误检查,而只是返回支持的源、方法和标头的 CORS 标头。浏览器仍会发出请求,但如果 CORS 响应标头与用户的请求不匹配,则浏览器会拒绝用户的响应。

这些方法中的每一种都有其优点和缺点。方法 #1 更接近 CORS 规范,但没有向用户提供有用的调试信息。

方法 #2 更深入地了解支持的方法和标头是什么。它也更容易实现,因为无论请求标头如何,服务器都会返回相同的响应标头。然而,这是以在服务器端实际执行请求为代价的,即使浏览器会阻止用户的响应。这对于具有副作用的方法(例如 POST、PUT 或 DELETE)可能是不可取的,并强调了 CORS 不应用作身份验证机制的事实。

(请注意,我上面的研究绝不是详尽无遗的。很难看到许多 API 的真实行为,因为它们要么需要身份验证,要么因其他错误(例如不受支持的方法)而在不同级别阻止请求。)

于 2012-12-28T03:38:36.497 回答
3

我只是想补充一下Monsur的答案。还有另一种行为(S3 当前正在使用的行为):

  1. 仅在与请求的 Origin 匹配时发送 CORS 响应标头。否则,根本不发送任何 CORS 标头,让您的浏览器或任何其他客户端自行决定。

至少这对我来说是这样的。

此外,当涉及到 Java 时,发送 403 是很常见的。那个 Java 链接已经很老了,但是 Java 中的事实标准 Spring 方法是相同的。在这里查看我的参考资料。

于 2019-04-14T10:55:50.107 回答
0

我预计这将取决于错误的性质,但我预计会出现一些 4xx 错误,例如 403(如果请求不符合某些要求的标准)或 404(如果该方法不可用)。

于 2012-12-23T22:26:59.903 回答