【问题标题】:Securing Node.JS APIs保护 Node.JS API
【发布时间】:2016-02-03 21:33:01
【问题描述】:

现在我已经阅读了这个Secure node.js restful API 但我需要更多细节。

目标 从客户端(js,angular,ejs)调用一个api到服务器(node.js),但足够安全,不能仅仅篡改发送的键:值。

情况 我为特定的 uri 和 return res.json(); 创建了一个 app.post({});。现在问题来了,

控制器接受一个参数说 id。现在 id = 1 是 Apple,id = 2 是 Microsoft。

我分别返回 Apple 和 Microsoft,但我不希望访问者(匿名)可以将 id 更改为 2 并获取 MIcrosoft 的数据。

  1. 此时访问者是匿名的,对于非匿名用户,我使用会话。
  2. 如果我保留盐或生成哈希,那么算法将通过源代码可见。
  3. 如果我使用 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 是这里的主要内容 你会怎么处理呢?

【问题讨论】:

  • 你不能。不可能。用户有权将他们想要的任何数据包扔到您的服务器上。由您在服务器端执行授权。
  • 那你有什么建议?考虑到 id 是主要元素我应该以加密形式使用 id 并在服务器上解密它吗?或者别的什么

标签: javascript angularjs node.js security ejs


【解决方案1】:

您无法控制服务器外部发生的事情。用户可以完全控制他们在请求中添加的内容。

我分别返回 Apple 和 Microsoft,但我不希望访问者(匿名)只需将 id 更改为 2 并获取 MIcrosoft 的数据。

然后您需要在允许他们访问 Microsoft 的数据之前执行身份验证和授权检查。

此时访问者是匿名的,对于非匿名用户,我使用会话。

如果您有匿名访问者,那么您需要在服务器上检查是否允许将所请求的内容提供给匿名用户。如果不是,您需要拒绝未经授权的请求。

如果我保留盐或生成哈希,那么该算法将通过源代码可见。

这没关系,因为只有授权用户才应该有密码才能输入哈希算法。无论如何,这不应该是相关的,您应该使用 HTTPS 来保护客户端和服务器之间的数据,并使用加密哈希来保护存储在用户数据库中的数据。

如果我使用 AUTH,则凭据将可见。

仅限您和凭据所属的授权用户(假设您使用 HTTPS,您应该这样做)。

【讨论】:

  • 要点是,如果我执行 ajax 请求,即使是 https,我也可以轻松转到源代码并准确查看传递了哪些参数以及返回了哪些数据
  • @RohitHazra — 是的,你可以。但这应该不是问题。首先,您不会在请求中放置用户无权查看的任何内容,如果他们更改参数以要求他们不允许查看的内容,那么您将拒绝该请求,因为对于未经授权的事情。
  • 从现在开始,在我提供的示例中,如果我在 opid 中发送“1”,我将获得 1 的数据,而“2”将获取 2 的数据。那么你有什么建议像 session 这样来存储这些,但是如果请求是通过 android 的(我不是 android 天才),但我想我可以看到 url 和参数
  • 在每个请求中输入用户的用户名和密码。
  • 我面临的问题是访问数据的设备类型,除了网站本身还有嵌入式设备、手机和WPF应用程序
【解决方案2】:

虽然第 1 项和第 2 项取决于您的架构,但我不知道您为什么不将身份验证数据与其他空间区分开来,而不是在同一个空间中使用所有数据。

到目前为止,这个解决方案看起来相当简单,在您的数据库(后端)中使用 UDIDs 而不是整数 ID。

如果您可以分享您拥有的代码和您尝试通过 API 提供的数据的示例,这将使我们能够更详细地阐述它。

谢谢。

【讨论】:

  • 请看,我添加了一个示例
猜你喜欢
  • 2018-09-13
  • 1970-01-01
  • 2018-03-31
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2022-01-07
  • 2021-09-06
相关资源
最近更新 更多