例如,让我们看看一个网站的通用登录系统
- HTTPS 连接已建立
- 用户通过 POST 提交凭据
- 服务器端代码对密码进行哈希处理并查看它是否与用户名匹配
- 会话被初始化,可能会发出密钥再次登录,无需密码(“记住我”)
这通常是目前的现状,密码都是在服务器上计算的。但是,如果我们在客户端执行以下操作,则认为这是一种不好的做法:
- HTTPS 连接已建立
- JavaScript 计算哈希(可能请求特定用户盐)
- 脚本发送带有用户/哈希值的 AJAX
- 服务器端代码查看密码的哈希值和用户名是否匹配。
- 会话被初始化,可能会发出密钥再次登录,无需密码(“记住我”)
有人可以解释为什么这种其他方法被认为是做 CS 而不是 SS 的坏习惯吗?两者都通过 SSL 传输,都创建安全散列,并且都应该通过编写良好的代码来进行身份验证。两者都容易受到 XSS 和其他不良设计的影响。