在 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)!它可以根据您的需要进行配置。只需查看文档
祝你有愉快的一天!
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)!它可以根据您的需要进行配置。只需查看文档
祝你有愉快的一天!