2010-01-02 113 views
0

正在存储用户名 & 密码的cookie中的用户良好的做法?我真的很想知道像(Facebook,digg,twitter)这样的大网站如何处理这个问题。我的代码是这样的:使用Cookie的安全会员登录

<?php 

$username = mysql_real_escape_string($_POST['username']); 
$password = md5($_POST['password']); 

?> 

每次成功登录后,我存储$username$password(MD5)在cookie中。并重新生成会话ID与session_regenerate_id()


,并以我检查,如果一个登录会话中存在用户进行身份验证,否则我验证的cookie。

任何想法?由于

回答

2

我有点困惑 - 你使用PHP会话还是cookies?

如果您在会话中存储($_SESSION['username'] = 'Tom'等)的数据,该数据不存储在用户的cookie。

如果你存储在一个单独的cookie(这样的事情自动登录)的数据,你可能希望存储不同,随机ID代替,并且查找用户ID的数据库表。

autologins 
---------- 
key (random hash) 
user_id 
expires 
+0

我验证cookie,然后设置会话。如果一个会话已经设置,我直接使用它。你的自主论思路很好。谢谢。 – MoeAmine 2010-01-02 13:02:45

0

只是一个MD5是不够的,你至少应该包括随机的“盐”(字符的小的随机字符串),你在你的数据库存储。

编辑:顺便说一句,你存储密码明文或加密?这可能是一个更大的安全风险。

+0

好吧,我有一个关于盐渍的想法..但它足够安全的将它存储在cookie中? – MoeAmine 2010-01-02 12:42:08

+0

仅存储在MD5中。但我会改变这个策略。 – MoeAmine 2010-01-02 13:17:26

0

标准的做法是给用户一个会话ID在Cookie中,无论是自己或使用PHP会议。将用户名和密码哈希存储在cookie中仍然由一些网站完成,但我更喜欢前者。它允许您为用户提供更多的登录控制权,例如他们可以查看他们拥有多少会话以及来自哪个IP--请参阅GMail以获取一个很好的示例。

在盐和散列的问题,您应该存储在数据库中腌密码哈希值。理想情况下,每个用户的盐应该不同。如果您的数据库被盗或暴露出来,这将使攻击者很难获取密码(如果他们都使用相同的盐,他们可以为该盐生成彩虹桌,这需要很长时间,但会让他们然后很快破解密码)。为了安全,盐应该还包含一些非字母数字字符,如%$ & ^。

+0

我没有任何关于在cookie中处理sesion ID的背景,但是我正在处理的项目并不需要为用户提供他们的ip,会话等等。正如你所说的。感谢腌制战略的解释。 – MoeAmine 2010-01-02 13:16:05

0

Joel L的答案是一个很好的答案。我唯一要补充的是,您可以添加一些标识用户的额外信息,使其更安全,而不是随机ID。

例如,使用用户IP地址和盐的散列,为窃取或嗅探用户安全Cookie的用户提供额外的安全性。

我怀疑TWitter使用这样的东西,这就是为什么你一次只能从一台计算机永久登录到Twitter。