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

标签 javascript security

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

也就是说,可以执行以下操作。我所说的“好吧”是指如果这是在某些新流行的时尚炫酷 Web 应用程序上使用的方法。知道我不会看到“Super Cool Web App Hacked,更改你的密码!”,我可以在晚上 sleep 吗?由于此实现,遍布 HN 和 Reddit(或人们关心的任何其他信息来源)。

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

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

欢迎部分回答。只是寻求更好的理解。


编辑

我正在考虑一些人试图窃取用户凭据的情况。我的理解是 cookie 是不安全的,因为 1.) 其他 javascript(通过 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 对象。

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

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

关于Javascript 安全 : is storing sensitive data in a self invoking function more secure than cookies?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11768832/

相关文章:

javascript - 有没有办法限制输入类型文件中的字符数

javascript - 使用 require ('some_module.js' 时运行脚本 - 好的做法吗?

security - 查询 TFS 的权限

security - 使用 Elasticsearch 防止 NoSQL 注入(inject)

java - Spring Boot 测试不尊重 Web 安全配置

javascript - 验证重定向是否来自特定域的最安全方法是什么?

javascript - ExtJS 4 及其新的 MVC : grid: how to handle keys?

javascript - 检查 Protractor 中是否存在元素

JavaScript 使用正则表达式进行验证

Java 小程序 java.security.AccessControlException