【问题标题】:What is the expected response to an invalid CORS request?对无效 CORS 请求的预期响应是什么?
【发布时间】:2012-12-10 12:11:50
【问题描述】:

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

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

【问题讨论】:

    标签: cors


    【解决方案1】:

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

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

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

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

    这些方法各有优缺点。方法 #1 更接近 CORS 规范,但没有向用户提供有用的调试信息。

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

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

    【讨论】:

    • 可以说,服务器可以有一个逻辑分支遵循您的建议 2 而无需在服务器上执行代码。
    • @monsur,说方法#2 向用户返回调试信息是错误的。此“调试信息”仅限于开发人员工具。有no way you could try to "catch this error" on the Javascript side。还有另一种选择#3:只需终止底层连接。
    • S3 在没有匹配的情况下甚至不会发回任何东西。
    【解决方案2】:

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

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

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

    另外,对于 Java,发送 403 是很常见的。那个 Java 链接已经很老了,但 Java 中的事实标准 Spring 方法是相同的。请参阅我的参考资料here

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-18
        • 2019-12-19
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 2016-02-05
        相关资源
        最近更新 更多