Javascript安全性:将敏感数据存储在比cookie更安全的自调用功能中?

KTa*_*phy 7 javascript security

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

也就是说,以下是可以的.通过"好的"我的意思是,如果这是一些新的流行时尚酷网络应用程序使用的方法.知道我不会看到"Super Cool Web App Hacked,改变你的密码!" 作为这种实现的结果,遍布HN和Reddit(或人们关心的任何其他信息来源).

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

如果安全吗?你有多确定?为什么安全?是什么阻止我在明显无能为力的情况下获取这些信息.

部分答案是受欢迎的.只是寻求更好的理解.


编辑

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

我知道一些假设的浏览器漏洞有助于使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>
Run Code Online (Sandbox Code Playgroud)

Ell*_* B. 6

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

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

当您在单个页面上从多个源运行应用程序(例如,Facebook应用程序)时,上面的第二项变得更加相关.在这些情况下,您必须注意不要通过使用闭包来暴露敏感变量.您实际上已经这样做了:您的user对象在闭包内声明.这可以防止页面上的任何其他JS函数访问该user对象.

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

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