您的服务器颁发的 API 密钥具有与之关联的 CORS 来源。当服务器收到 API 请求时,它会从自定义标头中发送的 API 密钥中检索 CORS 来源并执行 CORS 判断。由于在预检请求期间未发送自定义标头(API 密钥),因此无法执行 CORS 判断。
解决方案是,我们考虑在预检请求时允许任意来源,不做 CORS 判断,在后续的 GET 和 POST 请求中根据 API key 关联的 CORS 来源进行判断,这样会不会存在安全问题?
您的服务器颁发的 API 密钥具有与之关联的 CORS 来源。当服务器收到 API 请求时,它会从自定义标头中发送的 API 密钥中检索 CORS 来源并执行 CORS 判断。由于在预检请求期间未发送自定义标头(API 密钥),因此无法执行 CORS 判断。
解决方案是,我们考虑在预检请求时允许任意来源,不做 CORS 判断,在后续的 GET 和 POST 请求中根据 API key 关联的 CORS 来源进行判断,这样会不会存在安全问题?
预检请求的存在是为了防止预 CORS Web 应用程序由于 CORS 的出现而变得脆弱。
即使没有预检请求,现代应用程序也可以通过检查 HTTP 请求中的 Origin 标头来阻止应用程序端未经授权的请求。
然而,CORS 之前的应用程序并没有实现这样的安全功能。
危险请求启用的主要攻击媒介是跨站点请求伪造 (CSRF)。虽然在 CORS 之前就应该缓解通过 POST 请求发起的 CSRF,但使用 PUT 或 DELETE 等方法的端点在 CORS 之前没有已知的攻击媒介。因此,使用 PUT 或 DELETE 的端点可能未实施 CSRF 对策。
简单请求与预检请求密切相关,它们对应于可以通过 HTML 表单发送的请求。其他请求如果没有 CORS 则无法发送。因此,预检请求的存在是为了应对开发人员可能认为“此端点需要 PUT 方法。PUT 方法无法通过 HTML 表单发送。因此,此端点不需要 CSRF 保护”的情况。
因此,对于新开发的 API 端点,预检请求的保护并不是必不可少的,并且可以在 GET 和 POST 端点主体本身上实施对策。
但是,是否真的有必要允许所有来源的预检请求?