我正在CORS standard之后在服务器内实现CORS协议。我的问题是,当服务器希望拒绝特定来源时,应该如何响应。
我了解允许Origin时如何响应简单和预检请求。但是,如何响应服务器不想允许的那些起源呢?我最初的猜测只是不返回任何CORS标头,否则将导致预检请求失败。
该标准在3.2.3节中简要提到了这一点,但听起来好像它描述的是一个根本不希望参与CORS 的服务器(而不是想要参与的服务器)在CORS中,并且允许某些起源,但不允许其他起源)
如果服务器不希望参加CORS协议, 其对CORS或CORS-preflight请求的HTTP响应不得 包括以上任何标题。鼓励服务器使用 这样的HTTP响应中的403状态。
这是响应服务器不想允许的起源的正确方法吗?客户端可能将其误解为“此服务器不允许任何跨源请求”(实际上,此特定起源存在问题,服务器允许其他起源)
我知道this question,但它指的是规范的过时版本,答案似乎并不确定。
答案 0 :(得分:1)
默认情况下,CORS是禁用的,因此,如果您不希望给定主机获取响应,请不要将其添加到服务器返回的CORS Access-Control-Allow-Origin标头中
访问控制允许来源:https://www.example.com
如果主机向您的服务器发出请求,但未在此标头中列出,则它们将在预检请求中收到错误响应。
带有CORS的Nginx配置示例如下
server {
listen 80;
server_name api.example.com;
location / {
# Simple requests
if ($request_method ~* "(GET|POST)") {
add_header "Access-Control-Allow-Origin" "https://example.com";
}
# Preflighted requests
if ($request_method = OPTIONS) {
add_header "Access-Control-Allow-Origin" "https://example.com";
add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
return 200;
}
# Handle request
}
}
此外,规范中有关预检请求错误的重要说明:
CORS故障会导致错误,但是出于安全原因,JavaScript代码无法提供有关错误原因的详细信息。所有代码都知道发生了错误。确定到底出了什么问题的唯一方法是查看浏览器的控制台以了解详细信息。
答案 1 :(得分:1)
[403错误状态]是响应服务器不希望允许的起源的正确方法吗?客户端可能会误认为它是“此服务器不允许任何跨源请求”(实际上,此特定源存在问题,而服务器允许其他源)。
发送错误代码,请求 script 可能会误解。这是CORS设计的一部分。为避免混淆浏览器,请确保将标头Vary: Origin
与响应一起发送。这告诉客户端的浏览器,如果源不同的脚本试图访问相同的资源,则应再次检查而不是查找缓存的CORS参数。参见here进行一些讨论。