在 2 个允许的来源(快递、交叉来源)之间安全交换数据的方法是什么

what is the way to safely exchange data between 2 allowed origins (express, cross origin)

TLDR:我读到可以为请求手动设置“来源”header, 并且 CORS 策略仅保护浏览器请求。 如何让我的应用程序安全地将数据发送到允许的来源?


我正在制作一个带有 express 的个人服务器,它可以从多个来源获取数据并将其传送到多个目标,包括一个静态网站

关于这个 api 我使用了一些快速路线 & socket.io,但为了简单起见,我只讨论快速路线。

我已经通过在响应中添加 Access-Control-Allow-Origin header 来实施 CORS 策略,但我可以看到程序或服务器请求(如 curl)未启用 CORS

所以我添加了一些逻辑来检查“来源”header 是否在我的白名单中,如下所示:

// cors middleware

module.exports = function corsCheck (req, res, next) {
  const origin = req.header("origin")
  const host = req.header("host")
  
  // list of allowed origins
  const allowed = [
    "https://gui3.github.io" 
  ]
  
  res.header({
    // "Content-Type": "application/json",
    "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept"
  })
  
  if (allowed.includes(origin)) { // here is the cross origin logic
    res.status(200)
    res.header("Access-Control-Allow-Origin", origin)
    next()
  }
  else {
    console.log("403 forbidden request")
    res.status(403)
    
    res.json({
      allowed: false,
      error: "403 forbidden access"
    })
  }
}

并在 app.js

// ... express stuff

// send data
app.get("/data", corsCheck, (req, res) => {
  
  res.send(data)
})

// more express stuff

目前一切正常,但我阅读了 here 你可以指定一个手工制作的来源至少在卷曲中。

我的问题是:

如何确定请求的真实来源?以及如何让我的 api 对仅来自我的静态网站的请求开放?

PS : 我虽然在自定义 header 中使用了某种密码,但由于我的网站是静态的,我不知道如何在开源静态中使用安全密码网站。

看来您需要的不仅仅是 CORS 来解决您的问题。

尝试使用 JSON Web Token (https://jwt.io/)(https://www.youtube.com/watch?v=7Q17ubqLfaM) or Sessions (https://www.npmjs.com/package/express-session) 实现身份验证系统,因为 Headers 可以手动设置并且可能不可靠。

如果你有能力,也试试看 HTTPS,它更安全,这个线程有更多相关信息:

并且一定要看看 cors 模块 (https://www.npmjs.com/package/cors)!它可以根据您的需要进行配置。只需查看文档

祝你有愉快的一天!