在Javascript变量中存储密码有什么安全隐患?

时间:2016-04-10 14:01:38

标签: javascript security

我正在开发一个需要良好安全性的网络应用。在目前的设计中,许多用户操作需要用户重新发送他们的密码(否则服务器必须以纯文本形式存储它,至少是暂时的。)

通过AJAX请求进行大量用户交互。我不想让用户为每个人重新输入密码,而是想做类似的事情:

var password_plain = document .getElementById ("password") .value;

ajax ("/login.php", {password: password_plain, username: ...});

// later

ajax ("/api.php", {password: password_plain, action: ...});

为了论证,假设设计通常是合理的,例如

  • 服务器不存储或泄漏纯文本密码

  • 正确设置了SSL

  • 客户端Javascript会定期检查我们是否仍然登录并在会话过期时设置password_plain=null(并清除DOM值)
  • 服务器本身是安全的

威胁模型是攻击者无法对客户端或服务器计算机进行物理访问,也无法在任何一个上运行任意代码,但可能诱使用户访问客户端浏览器中的恶意其他网页。

javascript变量中的密码是否安全?

2 个答案:

答案 0 :(得分:3)

取决于。

如果你没有正确地封装你的作用域,第三方脚本可以在执行期间读取和修改你的变量(假设它被保留多个事件循环滴答),但是,这有点边缘情况。只要它在任何类型的功能或模块中完成,并且您旁边没有XSS漏洞,那么您就是金色的。

还有一些关于可以查看内存和内容的程序的问题,但这也是无关紧要的,因为如果用户在他们的计算机上有这样的东西,那么你的JS代码是他们最不担心的。

我会补充说,不建议您反复传输密码,通常需要进行一次身份验证,获取某种一次性令牌(如会话令牌),并在此期间使用该身份验证。会话。与密码不同,当出现问题时,会话很容易在服务器端失效。

重要的是:

  • HTTPS:如果密码未加密,则不要通过网络传输密码。对客户端进行哈希或加密并不是一个可行的解决方案。
  • XSS或SQL注入 - 基本上从一种语言到下一种语言的任何转换都是危险的。确保在用另一种语言生成语句之前严格逃避。
  • 数据库中的纯文本密码 - 这更像是一个服务器问题,基本上,总是使用强加密哈希来在数据库中存储密码

答案 1 :(得分:0)

不,它在JavaScript变量中绝对不安全。如果您在本地存储它,那么跨站点脚本攻击(XSS)可能会以明文方式破坏和窃取用户的凭据。