对无效CORS请求的预期响应是什么?

时间:2012-12-23 22:13:05

标签: cors

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

在CORS错误的情况下,预期的响应应该是什么?我知道不同的服务器可能需要不同的行为。但是,如果服务器所有者不关心,我正在寻找可以接受的标准响应或响应。

3 个答案:

答案 0 :(得分:20)

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

1)如果CORS请求无效,则返回错误。这是Java CORS filter项目采用的路由。该库返回

  • 400错误请求不符合规范的请求
  • 403禁止使用无效的来源或标题。
  • 405方法不允许使用无效方法

2)在响应中返回CORS标头,让浏览器对访问详细信息进行排序。这似乎是更常见的方法,并且由Amazon S3,SoundCloud的API使用, FourSquare和Spotify(后两种API仅受益于支持简单的CORS请求)。在这种情况下,服务器不会执行任何错误检查,只返回支持的源,方法和标头的CORS标头。浏览器仍然发出请求,但如果CORS响应头与用户的请求不匹配,则浏览器会保留用户的响应。

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

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

(请注意,我上面的研究并非详尽无遗。很难看到许多API的真实行为,因为它们要么使用auth,要么在其他级别阻止请求以解决其他错误,例如不支持方法。)

答案 1 :(得分:0)

我希望它取决于错误的性质,但我希望有一些4xx错误,如403(如果请求未通过某些必需的标准)或404(如果方法不可用)。

答案 2 :(得分:0)

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

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

至少这对我有用。

此外,在Java方面,通常会发送403。该Java链接已经很旧了,但是Java的事实上的标准Spring的方法是相同的。参见我的参考文献here

相关问题