NodeJS - CORS middleware `origin` undefined

geo*_*gej 7 javascript node.js cors

I have an app using the cors npm package as middleware. I have it set up like this:

  if(process.env.NODE_ENV === 'production') {
    var whitelist = ['http://mywebsite.com', 'https://mywebsite.com']
    var corsOptions = {
      origin: (origin, callback) => {
          var originIsWhitelisted = whitelist.indexOf(origin) !== -1;
          console.log('ORIGIN: ', origin);  // => undefined
          callback(originIsWhitelisted ? null : 'Bad Request', originIsWhitelisted)
      },
      credentials:true
    }
    app.use(cors(corsOptions));
  }
Run Code Online (Sandbox Code Playgroud)

The origin parameter in my corsOptions is undefined. Why is this and how can I fix it?

Com*_*wan 11

当您在进行 API 调用的同一源中加载页面时,就会发生这种情况。除非 API 调用的域与提供页面的域不同,否则浏览器不会设置“Origin”标头。

这在此处进一步解释https://github.com/expressjs/cors/issues/113

如果您使用浏览器控制台进行 API 调用,从不同的网站中,您会看到浏览器设置了 Origin 标头,因此在通过 express 读取时它不会是未定义的。

您可以使用

if (whitelist.indexOf(origin) !== -1 || !origin) 
Run Code Online (Sandbox Code Playgroud)


Joa*_*era 5

If you do not want to block REST tools or server-to-server requests, add a !origin check in the origin function like so:

var corsOptions = {
  origin: function (origin, callback) {
    if (!origin || whitelist.indexOf(origin) !== -1) {
      callback(null, true)
    } else {
      callback(new Error('Not allowed by CORS'))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 在生产中使用 `if (!origin)` 时存在一个安全问题:许多渗透测试脚本没有设置 `origin`,因此它们的请求将通过此 CORS 测试。我的生产服务器受到了数千个渗透测试请求的攻击,直到我删除了“if(!origin)”测试。 (3认同)
  • 由于其未定义(如果同源),因此检查它而不是仅仅检查错误值不是有意义吗?`起源===未定义` (2认同)

dig*_*git 1

use 是配置中间件的方法。您必须仅在路由中应用 corsoptions。这是我根据文档看到的。还没有测试过。希望对你有帮助啊。

var whitelist = ['http://example1.com', 'http://example2.com']
var corsOptions = {
  origin: function (origin, callback) {
    var originIsWhitelisted = whitelist.indexOf(origin) !== -1
    callback(originIsWhitelisted ? null : 'Bad Request', originIsWhitelisted)
  }
}

app.get('/products/:id', cors(corsOptions), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for a whitelisted domain.'})
})
Run Code Online (Sandbox Code Playgroud)

  • 中间件的全部要点是将给定的操作应用于许多路由。如果需要,您当然可以在中间件级别使用 CORS。或者,您可以将其仅应用于特定路线。您不必将它与“app.get()”一起使用。它可以与“app.use()”一起使用就可以了。 (3认同)