我正在运行Socket.IO,服务器部分通过mysql查询确认用户名和密码(在js中运行),效果很好。我的问题是:是否可以安全地将客户端用户名/密码从客户端javascript发送到服务器javascript文件?没有用户能够看到密码?密码已经过哈希(通过PHP),但我不希望他们有哈希能够解密。
//编辑
经过进一步讨论后,我同意除了它所在的脚本之外的任何地方发送散列密码是不好的。是否有另一种方法来唯一标识用户并通过javascript传递这些变量,以便我的服务器js文件可以验证它们(没有密码)?
答案 0 :(得分:1)
用户身份验证的一种典型方式是用户通过SSL提供用户名/密码。将其与服务器上的凭据进行比较(通常通过您所描述的一些散列算法)。如果凭据验证,则服务器为该用户创建会话ID。会话ID临时存储在某个服务器上,并通过cookie返回给客户端。所有后续Web请求都将验证对此用户有效的会话ID是否在cookie中。如果是这样,那么它仍然是正确的用户。
会话ID与用户的实际凭据无关,并且每次用户登录时都应该不同,因此对于具有会话ID的用户凭据不存在长期风险。相反,会话ID只是发布到正确提供用户凭据的浏览器的临时令牌,因此服务器可以(在后续页面请求中)知道这些请求来自“登录”用户。
如果会话ID被盗(通过中间人窥探或类似的东西),那么拥有会话ID的任何人都可以临时访问该帐户。所以......如果您认为会话ID需要受到保护,那么您需要为初始身份验证和使用会话ID的所有后续页面访问都要求SSL。
会话ID可以是时间的(在一段时间后过期),服务器可以随时撤销一个,只需拒绝接受它作为经过身份验证的会话的指示。在这方面,它比使用任何真实和持久的凭证作为安全登录的重复指示更简单/更安全。