Node Express服务器中的CORS正则表达式

7
我正在创建一个 express 服务器。以下是代码片段。
const app = express();
app.use(cookieParser()); // mainly used to retrieve and store CSSO tokens
app.use(bodyParser.json());

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "https://the.real.url.com:8081");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header("Access-Control-Expose-Headers", "Content-Disposition, Content-Type");
    res.header("Access-Control-Allow-Credentials", true);
    next();
});

它目前正在工作。但我需要用正则表达式替换https://the.real.url.com:8081。 首先,它可以是https或只是http。 其次,可能有端口等等。
因此,当我将其编辑为https?://the.real.url.com:8081以允许httphttps时,我会得到以下错误:The 'Access-Control-Allow-Origin' header contains the invalid value 'https?://the.real.url.com:8081'. Origin 'https://the.real.url.com:8081' is therefore not allowed access. 我还尝试过其他变化,例如http(s?)://the.real.url.com:8081, https?://*等等,但都不起作用。
所以我想知道,是否不允许使用Regex? 但通配符*是可行的。
我做错了什么吗?
2个回答

9
你有没有看过Express的cors包:https://github.com/expressjs/cors,它允许你使用正则表达式匹配来源:
var express = require('express');
var cors = require('cors');
var app = express();

var corsOptions = {
  origin: /example\.com$/,
  methods: "GET,HEAD,PUT,PATCH,POST,DELETE"
};

app.use(cors(corsOptions));

您可以在单个端点上使用此软件包,例如:
app.get('/test/', cors(corsOptions), function (req, res, next) {
    res.json({msg: 'Success'});
});

在我读过的一篇文章(或其他StackOverflow答案)中,它说如果我按照片段中所做的那样做,就不需要使用那个。这就是为什么我没有使用它的原因。我想我错了。 - william
希望这能让你更进一步! - Terry Lennox
这个能用于 subdomain.example.com 吗? - Nux
不是100%确定,我希望子域名.example.com应该可以工作,但你需要测试一下。如果有必要,更改正则表达式将很容易。 - Terry Lennox
1
@TerryLennox 这将匹配 example.comsubdomain.example.com,但也会匹配 bad-actor-example.com,从而允许攻击者绕过跨域资源共享(CORS)限制。如果你不关心 https://example.com 域名,只需在正则表达式中包含前导点即可:origin: /\.example\.com$/ - undefined

5
Access-Control-Allow-Origin 头可以是以下两种形式之一:
  • *,允许来自任何地方的访问
  • 具体的 URL,路径为 /

你不能在此处放置正则表达式。


你可以将正则表达式应用于请求中的 Origin 头,并且如果匹配,则将来自 Origin 请求头的值复制到 Access-Control-Allow-Origin 响应头中。

var origin = req.get("Origin");
if (origin && origin.match(your_regex)) {
    res.header("Access-Control-Allow-Origin", origin);
}

或者您可以直接使用CORS中间件,该中间件有一个针对这种情况的配置选项

我认为至少对于express/connect服务器,应该使用req.get("origin") - austin_ce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接