如何清除JavaScript中的敏感内存?
我有一个登录表单,供用户键入密码。此表单绑定到AngularJS模型。假设在相应的控制器中,用户给定的密码通过如何清除JavaScript中的敏感内存?,javascript,angularjs,security,Javascript,Angularjs,Security,我有一个登录表单,供用户键入密码。此表单绑定到AngularJS模型。假设在相应的控制器中,用户给定的密码通过$scope.password可用 实际登录过程由以下函数调用处理:login($scope.email,$scope.password)。在这个过程之后,应用程序逻辑不再需要密码,我的愿望是将其从浏览器内存中清除 对我来说,最明显的问题是:在调用login($scope.email,$scope.password)后,为了清除当前绑定到$scope.password的值所在的内存,我可
$scope.password
可用
实际登录过程由以下函数调用处理:login($scope.email,$scope.password)
。在这个过程之后,应用程序逻辑不再需要密码,我的愿望是将其从浏览器内存中清除
对我来说,最明显的问题是:在调用login($scope.email,$scope.password)
后,为了清除当前绑定到$scope.password的值所在的内存,我可以做什么?我希望这个问题对于JavaScript一般来说是有效的
但接下来,我还有两个AngularJS特有的问题:
- 密码表单值是否绑定到更多AngularJS内部变量而不仅仅是
$scope.password
?在这种情况下,重写$scope.password
将没有帮助
- 切换视图时,与旧视图及其范围相对应的控制器将被“销毁”。我是否应该仅仅依靠垃圾收集在切换离开登录视图后的短时间间隔内清除包含密码的内存
如果这对你的应用程序来说是一个真正的风险,那么你唯一真正的选择就是创建一个独立于应用程序的登录页面
您可以使用标准登录表单提交密码,响应将强制浏览器获取新页面,并忽略所有具有密码的现有内存。由于在各种与web浏览器相关的场景中,没有任何内容对浏览器内存的内容作出承诺,因此您永远无法确定是否正在清除内存
考虑一下简单的JS代码:
x=1234;
x=5678;
即使在这样一个简单的代码片段中,您也不能保证您已经从内存中删除了1234
。您所知道的是,当您引用x
时,它的值将是5678
。您不知道是5678
重写了1234
还是写入了新的内存位置
类似地,一旦用户输入密码以响应包含以下内容的表单:
<input type="password" name="p">
你不能保证你能抹去保存密码的记忆;即使你再次运行表单
绕过这些限制的唯一方法是编写一个作为桌面应用程序或浏览器插件运行的胖客户端
请注意,上面的任何一条都不是为了说明浏览器在内存中隐藏着秘密。他们通常试图防止内存检查漏洞。只是你没有洞察到他们在做什么以及如何利用他们。即使您这样做了,它也会特定于每个浏览器版本
因此,除非你觉得你需要保护密码比保护银行更重要,否则要习惯这样一个事实:你必须把用户的密码放在(希望是)可靠的浏览器手中。使用二进制/字符类型的数组。
当需要消除内存中的数据时,用零填充数组
您试图解决的问题是什么?实际上,在JavaScript中无法做到这一点,因为运行时无法控制字符串原语在垃圾收集时会发生什么。@Pointy:如果您想说的是这样的话,我会回答“从内存中清除密码通常是不可能的或不可能的”。这是我正在开发的第一个更大的基于JavaScript的客户端应用程序,当然我对这里的最佳实践方法很感兴趣。问题是web应用程序必须依赖一组安全相关行为才能由客户端浏览器正确实现。像防止跨站点请求和正确实现cookie安全性这样的事情与代码必须信任的事情类似。每个窗口(每个窗口系列)都有一个独立的JavaScript运行时环境。此外,由于没有低级别的原始内存分配,因此实际上没有办法扫描可用内存(除非利用浏览器错误)。为什么您如此关注内存攻击?几乎每一个需要标准登录表单的web应用都有遭受内存攻击的风险。我不确定这是否是你需要关注的问题。相关:问题是如何从内存中清除密码。您无法控制如何在浏览器中管理内存。你的建议充其量只能释放记忆。这当然不清楚。内存扫描或进程转储仍然可以明文形式包含密码。True。我提到的风险是客户端应用程序中的一个bug,它可能在提交密码后读取保存密码的javascript变量。即,警报(pwVar);通过强制应用程序与密码表单使用单独的执行环境,您消除了变量滑过的机会。