如何正确地做CORS?

时间:2018-04-09 07:07:45

标签: javascript http security nginx cors

我的目标是将对网络应用程序的访问限制为任何没有来源的请求= http://localhost:3000

所以经过一段时间的互联网搜索后,我能够通过这种配置来(好吧,复制粘贴):

location / {
    set $cors '';
    if ($http_origin ~ 'http://localhost:3000') {
        set $cors 'true';
    }

    if ($cors = 'true') {
        add_header 'Access-Control-Allow-Origin' "$http_origin" always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE, PATCH, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
    }

    if ($request_method = 'OPTIONS') {
        # Tell client that this pre-flight info is valid for 20 days
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
        return 204;
    }

     proxy_pass http://10.131.20.142:8000/131j3yc1;
     proxy_set_header received-from "nginx";
     access_log /dev/stdout upstream_log;
}

我测试它以了解它的行为方式。当我发送带有http://localhost:3000的请求时,它会发送200 OK和CORS标头。当我发送没有来源或不同来源的请求时,它仍然发送200 OK但没有CORS头。当浏览器获得带有CORS头的响应时,它工作正常但是当CORS头不存在时,它会抛出这样的异常:

browser cors error

我想了解这里保护的CORS配置是什么?

  1. 起源是普通标题 - 任何人都可以通过nginx / curl发送任何来源
  2. 即使您发错了也没有来源,您仍然可以获得200
  3. 的数据

    我猜测我的配置是错误的,因为它不能有效地保护应用程序免受交叉源请求或我对CORS的理解不正确。

    有人可以帮助我弄清楚我在做什么/理解错误吗?

1 个答案:

答案 0 :(得分:0)

尝试使用 more_set_headers 而不是 add_header

more_set_headers 'Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, PATCH, OPTIONS';
more_set_headers 'Access-Control-Allow-Headers:Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With';
etc

more_set_headers 指令是HttpHeadersMore模块的一部分,该模块包含在nginx的nginx-extras flavor中,您可以通过执行以下操作将其安装在ubuntu 16上:

  

sudo apt-get install nginx-extras