使用 Node/Express 限制 CORS 来源不起作用

Posted

技术标签:

【中文标题】使用 Node/Express 限制 CORS 来源不起作用【英文标题】:Restricting CORS origin with Node/Express not working 【发布时间】:2017-08-15 09:03:40 【问题描述】:

我正在尝试使用 express.js CORS package 将 CORS 请求的来源限制为每个路由的一个特定域,如下所示:

const express = require('express');
const cors = require('cors');

const port = process.env.PORT || 3000;

let app = express();

app.get('/', cors(origin: 'http://example.com'), (req, res, next) => 
  res.sendStatus(200);
);

app.post('/', cors(origin: 'http://whatever.com') (req, res, next) => 
  res.sendStatus(200);
);

app.listen(port, () => 
  console.log(`Started on port $port`);
);

但是,这似乎没有任何效果,因为我可以在任何域中使用 GETPOST。然后我尝试使用以下方法将所有路线限制为一个单一来源,但遇到了相同的结果:

app.use(cors(origin: 'http://example.com'));

我在本地主机上的开发环境和 Heroku 上的生产环境中都遇到了这种情况。知道我错过了什么吗?

【问题讨论】:

***.com/questions/11001817/… 允许访问控制应设置为您想接受我认为的请求的站点 @Rico 例如,我应该怎么做才能只允许 POST 请求来自某个域? res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); 仍然允许任何来源发布。我并不像起源那样关心方法 res.header('Access-Control-Allow-Origin', 'http:/ricoGotSwag.com'); res.header('Access-Control-Allow-Methods', 'POST'); 【参考方案1】:

如果您的服务器正在发送Access-Control-Allow-Origin: http://example.com 响应标头,那么您实际上已经正确配置了它。

无论您从哪个来源发出请求,服务器都会返回 200 响应是预期的行为——即使对于那些来自配置的 http://example.com 以外的来源也是如此。

CORS 设置不会导致服务器阻止来自任何客户端的请求。

相反,如果服务器以 Access-Control-Allow-Origin: http://example.com 响应来自未在 http://example.com 运行的 Web 应用中的 javascript 代码的客户端请求,则 浏览器 阻止该 JavaScript 代码能够访问响应。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS 提供更多详细信息。

基本上它的工作方式是从服务器端,除了它发送的响应标头的不同之外,没有任何行为发生变化。所以服务器会像其他方式一样接收请求,并且会像其他方式一样发送响应。

然后浏览器将像其他情况一样接收响应。您将能够在浏览器开发工具中看到响应并在那里进行检查。但这并不意味着浏览器会将响应暴露给您的客户端 JavaScript 代码。

相反,浏览器会检查来自服务器的 Access-Control-Allow-Origin 响应标头的值,并且只有在服务器表示应该允许的情况下才会将响应跨域暴露给您的源:您的浏览器会检查 @ 的值987654327@ 与您的实际来源相反,如果它完全匹配或值为 * 以允许任何来源,则只有这样浏览器才允许您的客户端 JavaScript 代码访问响应。

【讨论】:

啊,好吧,我明白我在哪里弄糊涂了。那么有没有推荐的方法让我的服务器检查请求的来源并据此采取相应的行动? var ref = req.headers.referer; //req.headers.origin; if(ref==something) 做这个 else 做那个 该问题的答案取决于您所说的“采取相应行动”的含义,但无论如何,这似乎是您可能想作为与此问题不同的问题单独发布的问题。似乎您对您在此处发布的特定问题有了答案——我的意思是,就您看到所看到行为的原因以及您的快速 CORS 配置是否按预期工作(它是)或如果你在配置中犯了一些错误(你没有)或者它在某种程度上被破坏了(不是)。

以上是关于使用 Node/Express 限制 CORS 来源不起作用的主要内容,如果未能解决你的问题,请参考以下文章

React/Node/Express 和 google OAuth 的 CORS/CORB 问题

使用我的 node/express rest api 服务器获取数据时 CORS 被阻止

Angular/Node/Express/Passport 跨域问题 - 启用 CORS Passport Facebook 身份验证

Node、Express、Oauth2 和 Passport 的 Angularjs CORS 问题

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

在 node/express 中启用了 CORS,但得到“对预检请求的响应未通过访问控制检查”