字符串不变性关注nodejs / expressjs

时间:2016-12-08 10:44:56

标签: javascript node.js string security memory-management

我正在开发一个项目,我的安全团队已经提出了一个问题,即我们在字符串中捕获的敏感信息以及内存堆中是否存在该信息。

根据我在互联网上找到的最佳做法是将所有变量清除为null以从内存中清除原始值。但是字符串是不可变的,即使我们将变量设置为null,它们也会存在于内存中。所以string的值总是在那里。

Image demo for string memory allocation

所以我认为这个值会保留在内存中直到下一个GC循环。设置null不会立即消除掉。

我的一个建议是,不使用字符串来执行此类任务。他们建议我在nodejs中使用缓冲区。

现在我有一些假设和一些问题需要建议。

  1. 我们可以以缓冲区的形式从body-parser模块获取请求体。但在这种情况下,如果我想在DB等中插入记录,我不知道如何使用该信息。
  2. app.use(bodyParser.json({
      verify: function(req, res, buf, encoding) {
        req.rawBody = buf;
        console.log("rawBody", req.rawBody); // print buffer info
        console.log("rawBody in json", JSON.parse(req.rawBody.toString())); // print json format of request body
      }
    }));

    1. 如果我从request.body.key创建Buffer并将其传递给某个函数并使用buffer的tostring()方法来使用它然后我将缓冲区清零以删除原始值然后执行此toString()方法创建用于文本值的内存空间,当我清除缓冲区时它不会消失?
    2. callSomeSecurityFun (Buffer.from(request.body.password));
      
      function callSomeSecurityFun (passwordBuf) {
        var encryptedPassword = someencryptionLib.encryptPass (passwordBuf.toString(),'<some key>', '<some algo>');
        passwordBuf.fil (0);// clearing the buffer.
        return encryptedPassword;
      }

      1. nodejs所有request.body参数的内存分配如何工作?身体对象中的每个值都是字符串是不可变的吗?永远在记忆中?如果是的话,如果有人转储堆并可以访问所有敏感信息呢?或者我完全错了吗?
      2. 思想/建议?

        sgoyal

1 个答案:

答案 0 :(得分:0)

  

但是Strings是不可变的,即使我们将变量设置为null,它们也会存在于内存中。所以string的值总是在那里。

与任何其他值一样,字符串将一直存在,直到垃圾收集器被激活。将变量设置为null会导致值变为垃圾(即没有任何内容指向它),因此最终将从堆中清除它。