如何确保对我的服务器的请求仅通过单一来源/用户界面起作用?

Posted

技术标签:

【中文标题】如何确保对我的服务器的请求仅通过单一来源/用户界面起作用?【英文标题】:How to ensure requests to my servers functions only by a single origin / UI? 【发布时间】:2019-10-12 20:37:06 【问题描述】:

我有一个 node.js 服务器,它对我的​​ mongoDB 具有 HTTP CRUD 功能。

还有一个通过这些函数发送请求的 android 应用程序。

我想确保我的服务器能够响应来自特定来源的请求。

例如:只回答来自安卓应用的请求,或者我的电脑邮递员的请求。

如何确保没有其他人使用相同的 url 和端口发送请求会得到答复?

这是我的 server.js 文件:

const express = require('express');
const MongoClient = require('mongodb');
const bodyParser = require('body-parser');
var db = require('./config/db');
var app = express();


const port = 8000;
app.use(bodyParser.json());



MongoClient.connect(db.url, (err, database) => 
    if (err) return console.log(err)


    db = database.db("getremp")
    require('./app/routes')(app, db);



        app.listen(process.env.PORT || port, () => 

            console.log("Express server listening on port %d in %s mode - We Are lIVE!",app.settings.env.port, app.settings.env);
    );

)

还有我的 index.js:

const noteRoutes = require('./note_routes');
module.exports = function (app, db) 
    noteRoutes(app, db);
;

【问题讨论】:

【参考方案1】:

您可以通过以下方式进行控制:

发送包含密钥的特定标头,然后在您的节点应用程序中控制标头How to check headers in nodejs?

使用 HMAC 来验证用户并控制数据的完整性:Node Hmac Authentication

但您必须记住,从移动应用程序发出的所有流量都可以被拦截(例如使用 Fiddler)。切勿使用静态(非动态)值来确保身份验证

【讨论】:

我需要更改服务器上的每个函数和应用程序上的每个函数来检查/发送标头吗? 带有标题,您只需要在您的快速应用程序中注册一个新的中间件,在您的应用程序中,您需要在每次调用您的 api 时添加一个标题 我真的不明白我可以在哪里以及如何在服务器端使用它一次..通过您发送的示例,我可以看到它使用 req.headers ...您可以进入api函数.. 对不起.. 我还在学习 Node.js.. 我已经看到我可以使用这些功能添加一个中间件。就像在这里看到的:***.com/questions/46094417/… 非常感谢!

以上是关于如何确保对我的服务器的请求仅通过单一来源/用户界面起作用?的主要内容,如果未能解决你的问题,请参考以下文章

确保负载均衡器仅处理来自特定 url 的请求

如何限制 Lambda 函数仅响应特定来源?

阿波罗单一事实来源

确保所有 http 请求都通过我的 nginx api 网关

为啥我的 POST 请求仅对我的 API 不起作用?

只允许 CloudFront 从源服务器读取?