Node.js 使用Buffer.allocUnsafe()和Buffer.alloc()的情况是什么?
我对使用Node.js 使用Buffer.allocUnsafe()和Buffer.alloc()的情况是什么?,node.js,Node.js,我对使用Buffer.allocUnsafe()和Buffer.alloc()感到困惑,我知道Buffer.allocUnsafe()使用预填充数据或旧缓冲区创建缓冲区,但如果Buffer.alloc()使用零填充数据创建缓冲区,我为什么需要这样的东西呢 alloc(大小、填充、编码)->返回一个新的初始化缓冲区 指定大小的。此方法比Buffer.allocUnsafe(size)慢,但可确保新创建的缓冲区实例从不包含可能敏感的旧数据 allocUnsafe(大小)->缓冲区未初始化,分配的 内
Buffer.allocUnsafe()
和Buffer.alloc()
感到困惑,我知道Buffer.allocUnsafe()
使用预填充数据或旧缓冲区创建缓冲区,但如果Buffer.alloc()
使用零填充数据创建缓冲区,我为什么需要这样的东西呢
alloc(大小、填充、编码)->返回一个新的初始化缓冲区
指定大小的。此方法比Buffer.allocUnsafe(size)慢,但可确保新创建的缓冲区实例从不包含可能敏感的旧数据
allocUnsafe(大小)->缓冲区未初始化,分配的
内存段可能包含可能会丢失的旧数据
敏感的在不完全覆盖内存的情况下使用Buffer.allocUnsafe()创建的缓冲区,可能会在读取缓冲区内存时导致旧数据泄漏
注意:虽然使用Buffer.allocUnsafe()有明显的性能优势,但必须格外小心,以避免在Node.js
中的应用程序中引入安全漏洞。Buffer
是对RAM的抽象,因此如果以不安全的方式分配,缓冲区实例中甚至存在一些源代码的高风险。尝试运行console.log(Buffer.allocUnsafe(10000).toString('utf-8'))
,我保证您会在stdout中看到一些代码
分配是一个同步操作,我们知道单线程Node.js对同步的东西感觉不太好。不安全分配比安全分配快得多,因为缓冲区santarization步骤需要时间。安全分配是安全的,但存在性能权衡
我建议首先坚持安全分配,如果最终性能低下,可以考虑实现不安全分配的方法,而不暴露私有内容。请记住,
allocUnsafe
方法之所以使用“不安全”一词是有原因的。例如,如果您要通过一些合规性认证,如PCI DSS,我很肯定QSA会注意到这一点,并且会有很多问题。我想刷新缓冲区需要时间。如果您需要性能,并且您知道您将完全填充缓冲区,则无需首先刷新它。感谢您的评论谢谢您的回答我想补充一点,如果您100%确定您正在覆盖所有数据,则使用unsafeAlloc是完全安全的。例如复制操作const bufferCopy=Buffer.allocUnsafe(oldBuffer.length);oldBuffer.copy(bufferCopy)
这是allocUnsafe
的完美用例之一。是的,缓冲区API在V8堆之外运行,这意味着它直接分配RAM内存(如果使用不安全的方法,内存可能不是空的)