2011-07-27 56 views
0

所以现在当用户注册时,他们的密码被散列并存储,他们的id被存储为主键,并且默认情况下,email_activation字段中的单元被枚举为'no'。然后他们会发送一封电子邮件,通过点击下面的链接可以激活他们的账户。

http://website.com/activation.php?id=1&pass=23a000e03e9116c958dh923542

点击该链接后,下面的脚本运行

$id= $_GET['id']; 
$hashPass= $_GET['pass']; 

mysql_query("UPDATE members SET email_activation='yes' WHERE members_id='$id' AND members_password='$hashPass'") 

这个问题似乎像一个安全的方式来激活某个用户的帐户考虑其散列通是URL的一部分(假设的适当的卫生设施字符串等...)?

回答

2

有没有必要把密码,哈希或不,在链接(和不,你不应该这样做)。

Store中不同随机值除了密码在你的数据库,然后把这个随机值中的链接。 (请参阅:http://en.wikipedia.org/wiki/Cryptographic_nonce

由于随机激活值只能使用一次(并且不能授予对该帐户的正常访问权限),所以将其放入URL中可以。

+0

感谢琥珀,我喜欢将激活基于注册帐户时分配的随机值的想法。 – user784637

+0

其实,你可以推荐一个函数在PHP中生成随机长度的随机字母数字字符串? – user784637

+0

你可以根据'rand()'或'mt_rand()'自己写一个。 – Amber

3

否。使用单独的字段来包含激活散列,并将散列基于多个事物(用户名,密码散列,一天中的时间等)。

+0

感谢您的及时回复,我会尽快回复。所以通常可以在URL中包含激活散列? – user784637

+2

只要激活码不能被多次使用以访问帐户,就没关系。 (最好的系统甚至不会直接给你访问;他们仍然要求你在激活后登录。) – Amber

0

这样做不是很安全,没有。改为分配一个唯一的随机密钥会更好。

0

我想在表中创建另一个字段只是为了激活。这样你就不会在URL中拥有密码哈希。

(我的回复不够快)

相关问题