如何在JavaScript中清除敏感内存?

Jan*_*cke 5 javascript security angularjs

我有一个登录表单供用户输入他/她的密码.此表单绑定到AngularJS模型.假设在相应的控制器中,用户指定的密码可通过$scope.password.

实际的登录过程由此函数调用处理:login($scope.email, $scope.password).在该过程之后,应用程序逻辑不再需要密码,我希望从浏览器的内存中清除它.

对我来说,最明显的问题是:login($scope.email, $scope.password)为了清除持有$scope.password当前绑定值的内存,我可以在调用后立即做什么?我希望这个问题对JavaScript有效.

但是,接下来,我还有两个特定于AngularJS的问题:

  • 密码表单值是否绑定到更多AngularJS内部变量而不仅仅是$scope.password?在这种情况下,覆盖$scope.password将没有帮助.

  • 切换视图时,与旧视图对应的控制器及其范围变为"销毁".在离开登录视图后,我是否应该在短时间内完全依赖垃圾收集来清除包含密码的内存?

Nei*_*ine 7

由于各种与Web浏览器相关的场景都没有对浏览器内存的内容做出承诺,因此您永远无法确定是否正在清除内存.

考虑一下简单的JS代码:

x=1234;
x=5678;
Run Code Online (Sandbox Code Playgroud)

即使在如此简单的片段中,您也无法保证您实际上已从1234内存中删除.所有你知道的是,当你引用x它的价值时5678.您不知道是否已5678覆盖1234或写入新的内存位置.

同样,一旦用户输入密码以响应包含以下内容的表单:

<input type="password" name="p">
Run Code Online (Sandbox Code Playgroud)

您无法保证可以删除密码存储器; 即使你再次运行表格.

解决这些限制的唯一方法是编写一个作为桌面应用程序或浏览器插件运行的胖客户端.

请注意,上述内容均不表示浏览器内存中有秘密.他们通常会尝试防止内存检查漏洞.只是你没有洞察他们做了什么以及如何利用它.即使你这样做,它也将特定于每个浏览器版本.

因此,除非您认为需要保护密码而不是例如您的银行,否则请务必将您的用户密码放入浏览器(希望)值得信赖的手中.


gar*_*kin 6

使用二进制/字符类型数组。当您需要消除内存中的数据时,请用零填充数组。