2012-02-15 135 views
0

我正在运行Socket.IO,并通过mysql查询(在js中运行)确认用户名和密码,服务器部分工作良好。我的问题是:是否有可能将客户端的用户名/密码从客户端JavaScript安全地发送到服务器JavaScript文件?没有用户能够看到密码?密码已经哈希(通过PHP),但我不希望他们有那里散列可以解密。将用户名/密码安全地传递给另一个JavaScript文件

//编辑

经进一步讨论后我同意它是坏的任何地方发送散列密码,除了它驻留在脚本。是否有另一种方式来唯一标识一个用户,并通过JavaScript传递这些变量,所以我的服务器js文件可以验证它们(没有密码)?

+2

如果他们*解密散列,他们就会很有才华。 – alex 2012-02-15 06:18:48

+0

没错,我在php中使用了sha512 hash中的salt,尽管我的任何用户都能够知道有什么散列在我看来构成安全风险。 – 2012-02-15 06:21:15

+0

尽管用户知道自己的散列并不是什么坏事(毕竟,每一个散列都用一个每个用户都是唯一的salt),但如果这意味着要在其他地方进行身份验证,那么传递这个散列是不好的,除非您通过安全通道HTTPS传递它。 – Konerak 2012-02-15 06:23:12

回答

1

用户认证完成的一种典型方式是用户通过SSL提供用户名/密码。这是与服务器上的凭据进行比较(通常通过一些哈希算法,如您所描述的)。如果证书验证,则服务器为该用户创建一个会话ID。会话ID临时存储在服务器的某个位置,并通过cookie返回给客户端。所有后续的网络请求都将验证对该用户有效的会话ID是否位于cookie中。如果是这样,那么它仍然是合适的用户。

会话ID与用户的实际凭证无关,每次用户登录时都应该有所不同,因此用户凭证的会话ID没有长期风险。相反,会话ID只是发给浏览器的临时令牌,它正确提供了用户凭据,因此服务器可以知道(在随后的页面请求上)这些请求来自“已登录”用户。

如果会话ID被盗(通过中间人窥探等),那么具有会话ID的任何人都可以临时访问该帐户。所以......如果您认为会话ID需要受到保护,那么您需要为初始身份验证和随后使用会话ID的所有页面访问都要求SSL。

会话ID可以是临时的(在一段时间后过期),并且服务器可以在任何时候通过简单地拒绝接受它作为已认证会话的指示而撤消它。在这方面,比使用任何真实和持久的凭证作为重复的安全登录指示符要简单/安全得多。

+0

好吧,我看到你去那里的地方。所以如果我通过JavaScript传递会话ID,我怎么能去验证反对MySQL?我想我可以为session_id添加一个字段,并在每次用户登录时将其保存到数据库中?或者有更好的方法来处理这个问题? – 2012-02-15 06:38:40

+0

@EdR - 如何将会话ID存储在服务器上取决于您,最好的方式取决于您的应用的实现。将其存储在数据库中可能是最直接的处理方式。请注意,如何存储它可能会影响对于任何给定的用户是否有多个会话同时处于活动状态。 – jfriend00 2012-02-15 06:45:33

+0

将它存储在数据库中是很好的 - 然后您将为每个网页浏览查询您的数据库 - 但您可能已经是。您可以使用各种类型的memcached轻松地将其从数据库中移出。 – Konerak 2012-02-15 08:35:35

相关问题