Javascript Security:将敏感数据存储在比cookie更安全的自调用函数中

Javascript Security: is storing sensitive data in a self invoking function more secure than cookies?

本文关键字:安全 调用 函数 cookie Security 敏感数据 存储 Javascript      更新时间:2024-06-18

我知道安全性在客户端JavaScript中要么不存在,要么非常困难。我知道我的服务器端代码最终应该决定向谁提供数据或从谁接受数据。

也就是说,以下是可以做的。我所说的"好"是指如果这是一些新流行的时尚酷网络应用程序上使用的方法。我晚上睡觉时能知道吗?我不会因为这个实施而在HN和Reddit(或人们关心的任何其他信息来源)上看到"超级酷的网络应用程序被黑客攻击,更改你的密码!"。

如果它不安全。为什么?如何获取该信息(用户名和密码)?

是否安全?你有多确定?为什么它是安全的?是什么阻止了我获得这些信息,而我现在显然无能为力。

欢迎部分回答。只是想更好地理解。


编辑

我正在考虑一些人试图窃取用户凭据的情况。我的理解是,cookie是不安全的,因为1.)其他java脚本(通过XSS或其他方式)可以访问它们,并且因为2.)它们是透明传递的。我想SSL会解决第二个问题,让我们假设我能够阻止XSS。现在看来,cookie是安全的,对吧?

我知道一些所谓的浏览器漏洞会导致cookie不安全。这就是为什么我要问这个问题。考虑到所有使cookie不安全的因素,这(下面的代码)会更好吗?


http://jsfiddle.net/KTastrophy/vXEjm/1/或参见下面的代码(仅在Chrome中测试)

<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <form id="login">
            <div>
                <label for="username">Username</label>
                <input id="username" name="username" type="text" />
            </div>
            <div>
                <label for="password">Password</label>
                <input id="password" name="password" type="password" />
            </div>
            <div>
                <input id="submit" name="submit" type="submit" value="Login" />
            </div>
        </form>
    </body>
    <script type="text/javascript">
        ;(function () {
            "use strict";
            var login, user = {};
            login = document.getElementById("login");
            login.onsubmit = function (event) {
                event.preventDefault();
                user.username = document.getElementById("username").value;
                user.password = document.getElementById("password").value;
                /*
                    use the username and password here to do
                    an API request over SSL using HTTP Auth
                 */
            }
        }());
    </script>
</html>

当您处理存储在JavaScript中的敏感值时,您有两个主要的安全问题:

  1. 敏感值可以在源中以纯文本形式查看
  2. 页面上的另一个JS函数可以进入对象并提取这些值(即XSS攻击)

当你在一个页面上运行来自多个来源的应用程序(例如,Facebook应用程序)时,上面的第二项变得更加相关。在这些情况下,您必须注意不要通过对命名空间使用闭包来暴露敏感变量。实际上您已经在做了:您的user对象是在闭包中声明的。这将阻止页面上的任何其他JS函数访问user对象。

在您的情况下,我假设页面上除了您自己的代码之外没有任何其他代码,并且注入的可能性很小——您的代码是安全的:)

编辑:将用户名和密码存储在cookie中不安全的原因是,在关闭浏览器后,cookie会出现在您的计算机上。如果黑客可以(通过多种方式)访问cookie,那么你可能会遇到麻烦。您上面所做的是安全的,因为浏览器关闭后客户端上不会存储任何内容(当浏览器打开时,其他JS无法访问您存储的值)。如果你想在cookie中放入一些东西,最好存储某种公共/私人身份验证密钥。关于这一点有很多讨论,下面是一篇关于该主题的全面的"最佳实践"文章:http://jaspan.com/improved_persistent_login_cookie_best_practice

如果您存储的数据出现在源代码中,那么不,函数的toString方法可以用于将函数体转换为源代码。

function f() {
  var cryptoKey = "ABGASDJEOTATJKASDTNM...";
}
alert(f);

如果数据被关闭而不是出现在源代码中,并且该函数无法在其主体中调用eval,那么在现代解释器上是的。

较旧的Netscape解释器扩展了eval,以便可以通过eval("nameOfLocalVariable", fnToStealFrom)在函数内部运行代码。

如果函数调用了它的一个参数,那么它可能会像中那样被窃取

var f = (function () {
  var x = "secret";
  return function (a, b) { return a(b + x.length); };
})();
f(eval, "x//");

将窃取EcmaScript 3解释器和一些EcmaScript 5解释器的秘密。

将输入框的值保存在javascript值中非常好,因为自从用户输入后,他们显然就知道了

然而!将用户密码以纯文本形式存储在任何地方通常是不可取的。

编辑

SSL将使恶意观察者很难拦截和重新创建消息(如果有足够的时间,这不是不可能的,但这是大多数网络安全使用的)。在该页面上输入的javascript变量中临时存储一个密码是可以的。但是,不要以纯文本形式从服务器发送,否则您醒来时会看到糟糕的标题。

正如您的示例所示,您是完全安全的。

然而,这并不能取代cookie。在您的示例中,您将密码存储在本地代码中,但与cookie不同的是,这些值以后永远不能使用。

最好根本不存储该值,而是通过ssl使用传统的http身份验证。

编号。你能做的和需要做的是:

  • 保护数据库。将密码存储为盐水散列等
  • 确保连接的安全。您需要使用SSL

在客户端javascript代码中不可能存在安全性。用户以纯文本形式输入所有数据,因此页面中运行的每个脚本都可以访问这些数据。因此,您需要防止XSS。当然,cookie可直接用于域上运行的每个脚本,而隐藏在某些函数范围内的数据不是"全局变量",但每个恶意脚本都可以像您自己的应用程序一样访问它。

@您的代码:没错,没有人可以从外部访问user对象。但是,每个人都可以访问密码输入元素,每个人也可以劫持浏览器对象来窥探api请求。