保护 Node.JS 个 API
Securing Node.JS APIs
现在我已经读完这篇Secure node.js restful API
但我需要更多细节。
Objective
从客户端 (js,angular,ejs) 调用 api 到服务器 (node.js) 但足够安全以至于不能篡改发送的 key:values。
情况
我为特定的 uri 和 return res.json();
创建了一个 app.post({});
。现在问题来了,
Controller 接受一个参数 id。现在 id = 1 是苹果,id = 2 是微软。
我 return Apple 和 Microsoft 分别,但我不希望访问者(匿名)可以将 id 更改为 2 并获取 MIcrosoft 的数据。
- 此时访问者是匿名的,对于非匿名用户,我使用会话。
- 如果我保留 salt 或生成哈希,则算法将通过源代码可见。
- 如果我使用 AUTH,则凭据将可见。
我希望我的问题足够清楚,将等待答案。
示例代码
...
exports.statement = function(req, res){
dcn_db.pool.getConnection(function(err, connection){
if(!req.body.opid){
return res.sendStatus(400);
}
var opid = req.body.opid;
var con = req.body.con;
connection.query(data_model.mini_statement(req),[opid,con], function(err, rows, fields) {
if(err) {
console.log('Error while performing Query. ' + err); //error respose
return res.json({ error : "true"})
}else{
return res.json({ error : "false", data : rows}); //parse result to json instantly
}
});
connection.release();
});
};
...
以上代码接受了 opid 和 con....
opid 是这里的主要内容
你会如何对待它?
虽然第 1 项和第 2 项取决于您的体系结构,但我不知道您为什么不将身份验证数据与其他一些 space 区分开来,而不是在同一个数据中使用所有数据。
到目前为止,这个问题的解决方案看起来相当简单,在您的数据库(后端)中使用 UDIDs 而不是整数 ID。
如果您可以分享您拥有的代码示例和您尝试通过 API 提供的数据,那将使我们能够对其进行详细说明。
谢谢。
您无法控制服务器外部发生的事情。用户可以完全控制他们在请求中输入的内容。
I return Apple and Microsoft Respectively but I dont want that a visitor(anonymous) can just change to id to 2 and get MIcrosoft's Data.
然后您需要执行身份验证和授权检查,然后才能允许他们访问 Microsoft 的数据。
Visitors are anonymous at this point, for non anon users i use sessions.
如果您有匿名访问者,那么您需要在服务器上检查是否允许将请求的内容提供给匿名用户。如果不是,您需要拒绝未经授权的请求。
If I keep salt or generate hash then the algorithm will be visible via source code.
这无关紧要,因为只有授权用户才能将密码放入哈希算法中。无论如何,这不应该是相关的,您应该使用 HTTPS 来保护客户端和服务器之间的数据,并使用加密哈希来保护存储在用户数据库中的数据。
if I use AUTH then credentials will be visible.
仅对您和凭据所属的授权用户(假设您使用 HTTPS,您应该这样做)。
现在我已经读完这篇Secure node.js restful API 但我需要更多细节。
Objective 从客户端 (js,angular,ejs) 调用 api 到服务器 (node.js) 但足够安全以至于不能篡改发送的 key:values。
情况
我为特定的 uri 和 return res.json();
创建了一个 app.post({});
。现在问题来了,
Controller 接受一个参数 id。现在 id = 1 是苹果,id = 2 是微软。
我 return Apple 和 Microsoft 分别,但我不希望访问者(匿名)可以将 id 更改为 2 并获取 MIcrosoft 的数据。
- 此时访问者是匿名的,对于非匿名用户,我使用会话。
- 如果我保留 salt 或生成哈希,则算法将通过源代码可见。
- 如果我使用 AUTH,则凭据将可见。
我希望我的问题足够清楚,将等待答案。
示例代码
...
exports.statement = function(req, res){
dcn_db.pool.getConnection(function(err, connection){
if(!req.body.opid){
return res.sendStatus(400);
}
var opid = req.body.opid;
var con = req.body.con;
connection.query(data_model.mini_statement(req),[opid,con], function(err, rows, fields) {
if(err) {
console.log('Error while performing Query. ' + err); //error respose
return res.json({ error : "true"})
}else{
return res.json({ error : "false", data : rows}); //parse result to json instantly
}
});
connection.release();
});
};
...
以上代码接受了 opid 和 con.... opid 是这里的主要内容 你会如何对待它?
虽然第 1 项和第 2 项取决于您的体系结构,但我不知道您为什么不将身份验证数据与其他一些 space 区分开来,而不是在同一个数据中使用所有数据。
到目前为止,这个问题的解决方案看起来相当简单,在您的数据库(后端)中使用 UDIDs 而不是整数 ID。
如果您可以分享您拥有的代码示例和您尝试通过 API 提供的数据,那将使我们能够对其进行详细说明。
谢谢。
您无法控制服务器外部发生的事情。用户可以完全控制他们在请求中输入的内容。
I return Apple and Microsoft Respectively but I dont want that a visitor(anonymous) can just change to id to 2 and get MIcrosoft's Data.
然后您需要执行身份验证和授权检查,然后才能允许他们访问 Microsoft 的数据。
Visitors are anonymous at this point, for non anon users i use sessions.
如果您有匿名访问者,那么您需要在服务器上检查是否允许将请求的内容提供给匿名用户。如果不是,您需要拒绝未经授权的请求。
If I keep salt or generate hash then the algorithm will be visible via source code.
这无关紧要,因为只有授权用户才能将密码放入哈希算法中。无论如何,这不应该是相关的,您应该使用 HTTPS 来保护客户端和服务器之间的数据,并使用加密哈希来保护存储在用户数据库中的数据。
if I use AUTH then credentials will be visible.
仅对您和凭据所属的授权用户(假设您使用 HTTPS,您应该这样做)。