我有一个登录表单供用户输入他/她的密码。此表单绑定到AngularJS模型。假设在相应的控制器中,用户指定的密码可通过$scope.password
获得。
实际登录过程由此函数调用处理:login($scope.email, $scope.password)
。在该过程之后,应用程序逻辑不再需要密码,我希望从浏览器的内存中清除它。
对我而言,最明显的问题是:在调用login($scope.email, $scope.password)
之后我能做什么才能清除保存$scope.password
当前绑定的值的内存?我希望这个问题对JavaScript有效。
但是,接下来,我还有两个特定于AngularJS的问题:
密码表单值是否绑定到更多AngularJS内部变量而不仅仅是$scope.password
?在这种情况下,覆盖$scope.password
将没有用处。
切换视图时,与旧视图对应的控制器及其范围变为“已销毁”。在离开登录视图后,我是否应该在短时间内依靠垃圾收集来清除包含密码的内存?
答案 0 :(得分:7)
由于各种与Web浏览器相关的场景中没有任何内容可以对浏览器内存的内容做出承诺,因此您无法确定是否正在清除内存。
考虑简单的JS代码:
x=1234;
x=5678;
即使在如此简单的代码段中,您也无法保证自己已经从内存中删除1234
。您所知道的是,当您引用x
时,其值将为5678
。您不知道5678
是否已覆盖1234
或是否已写入新的内存位置。
同样,一旦用户输入密码以响应包含以下内容的表单
<input type="password" name="p">
您无法保证可以删除存有密码的内存;即使你再次运行表格。
解决这些限制的唯一方法是编写一个作为桌面应用程序或浏览器插件运行的胖客户端。
请注意,上述内容均不表示浏览器内存中包含秘密。他们通常会尝试防止内存检查漏洞。只是你没有洞察他们做了什么以及如何利用它。即使你这样做,也会特定于每个浏览器版本。
因此,除非您认为需要保护密码而不是银行,否则请务必将您的用户放在用户身上。密码进入(希望)值得信赖的浏览器之手。
答案 1 :(得分:1)
使用二进制/字符型数组。 当你需要消灭内存中的数据时,用零填充数组。
答案 2 :(得分:0)
如果这对您的应用确实存在风险,那么您唯一真正的选择是创建一个与应用程序分开的登录页面。
您可以使用标准登录表单提交密码,响应将强制浏览器获取新页面,并且忽略所有带密码的现有内存。