1
我正在研究一個項目,該項目中我的安全團隊提出了有關我們在字符串中捕獲的敏感信息以及該信息在內存堆中存在的問題。關於nodejs/expressjs中請求參數的字符串不變性問題
根據我在互聯網上發現的最佳實踐,將所有變量清除爲空以清除內存中的原始值。但是字符串是不可變的,即使我們將變量設置爲null,它們也會在內存中。所以字符串的值總是在那裏。
Image demo for string memory allocation
所以我覺得這個值保持在內存中,直到下一個GC cycle.setting空不會消滅了這立刻。
一個建議來到我這裏,沒有使用字符串來完成這樣的任務。他們建議我在nodejs中使用緩衝區。
現在我有一些假設和一些問題,我需要建議。
- 我們可以以緩衝區的形式從body-parser模塊中獲取請求體。但是,在這種情況下,我不知道如何使用這些信息,如果我想插入記錄在DB等
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
}
}));
- 如果我創建來自request.body.key的緩衝區並將其傳遞給某個函數並使用緩衝區的tostring()方法來使用它,然後我將緩衝區清零以刪除原始值,然後執行此操作toString()方法爲文本值創建一個內存空間並且在清除緩衝區時不會消失?
- 如何對的NodeJS所有request.body參數存儲器分配的作品? Body對象中的每個值都是不可變的嗎?並始終在內存中?如果是的話,如果有人傾倒堆並可以訪問所有敏感信息?或者我完全錯了嗎?
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;
}
想法/建議?
sgoyal
[看這裏](https://i.stack.imgur.com/sLEfv.png)。我認爲未引用的值保留在內存中,直到下一個GC cycle.setting null不會立即消除。思考? –
當然。在內存中不再需要字符串的時間和GC運行的時間(可能少於一秒,可能是幾秒鐘)之間可能會有幾秒鐘的時間。如果它*是*嚴重的,你總是可以明確地調用GC(你可以在這裏閱讀:http://stackoverflow.com/a/11024653/1597872 ,但它被認爲是不好的做法。 – GilZ