使用通配符域在 nginx 中设置 Access-Control-Allow-Origin

Jus*_*tin 9 security nginx http-headers

随着nginx我可以指定Access-Control-Allow-Origin使用像一个通配符*.mydomain.com

它看起来像:

add_header Access-Control-Allow-Origin *.mydomain.com;
Run Code Online (Sandbox Code Playgroud)

谢谢。

小智 9

你必须用 if 条件来做

location /  {
  set $cors "";
  if ($http_origin ~* (\.mydomain\.com|\.myseconddomain\.com)$) {
      set $cors "true";
  }

  proxy_pass http://backend:10005/apathifyouwantso/;

  if ($cors = "true") {
    add_header 'Access-Control-Allow-Origin' "$http_origin";
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Headers' 'User-Agent,Keep-Alive,Content-Type';
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

根据nginx中的条件设置“Access-Control-Allow-Origin”是非常危险的,你应该小心。上面的答案是打开一个安全漏洞。

if ($http_origin ~* (\.mydomain\.com|\.myseconddomain\.com)) 
Run Code Online (Sandbox Code Playgroud)

此行将匹配something.mydomain.com以及something.mydomain.com.anyotherdomain.com(任何人都可以创建的域)

这样做,将允许以下场景:

  1. 横幅让用户打开 Something.mydomain.com.anyotherdomain.com
  2. 它使用 向您的网站发出请求fetch
  3. 获取,可以包含凭据,这意味着您的用户 cookie。
  4. 因此,攻击者可以向以该用户身份进行身份验证的服务器发出请求。(例如:发送消息、电子邮件等)

所有这些都是因为正则表达式末尾缺少一个“$”。

if ($http_origin ~* (\.mydomain\.com|\.myseconddomain\.com)$) 
Run Code Online (Sandbox Code Playgroud)

这不是使特定正则表达式变坏的唯一方法,这就是为什么我解释这个问题,而不是仅仅在前面的答案中添加 $


Ste*_*han 1

你当然可以。我使用以下指令来支持我们的一些跨域字体:

  add_header Access-Control-Allow-Origin *;
Run Code Online (Sandbox Code Playgroud)

  • 不,我不想为所有内容使用通配符,但只希望为anything.mydomain.com。我有一个 SaaS,每个注册都有自己的子域 (user.mydomain.com)。另外,我正在测试并放置“add_header Access-Control-Allow-Origin http://google.com;”进行测试,并假设请求会失败,但令人惊讶的是它们仍然有效。知道为什么吗?他们应该失败吧? (7认同)
  • 实际上进一步的研究表明,“Access-Control-Allow-Origin”仅支持“*”和完整主机,即**不**支持通配符域。但是仍然不确定为什么当我设置时请求有效:`add_header Access-Control-Allow-Origin https://google.com;` (3认同)