2012-03-30 49 views
0

我的PHP codeigniter网站向用户发送3种类型的电子邮件,它们是html格式的,我希望在浏览器中查看此电子邮件链接选项。为HTML电子邮件创建安全的“在浏览器中查看电子邮件”链接

如何创建合理安全的链接?电子邮件的2本质上是敏感:

  1. 新注册:电子邮件显示他们的详细信息和激活链接

  2. 忘记密码:电子邮件显示的链接重置通过


只是做这样的事情就够了:

$code = sha1(mt_rand(10000,99999).time().$user_email); 

$link = 'email/view/' . $code . '/' . $user_id . '/'; 

     => http://mysite.com/email/view/c0acc09c6d00b706e1e511e52f286b1859067047/213/ 


因此,认证将基于随机散列和他们的user_id完成。是否值得哈希用户ID呢?

+0

我认为你在谈论2种不同的东西。 1)如何在浏览器中显示电子邮件(我从未见过的选项)以及2)如何在电子邮件中提供URL以验证用户身份。我认为后者是你真正想要实现的那个,我说得对吗? – Anthony 2012-03-30 01:58:42

+0

使用'mt_rand()'没有任何参数。这将为您提供数十亿个可能的数字,而不仅仅是99999.您还可以通过使用'microtime()'而不是'time()'来获得更多不可预知的哈希值。这完全是为了增加可能的哈希数。 – kijin 2012-03-30 02:00:15

+0

谢谢,我已经更新了sha1(mt_rand()。microtime()。$ user_email)); – Quadrant6 2012-03-30 02:10:07

回答

2

我不会包含user_id作为URL参数,我只是坚持散列。

只要有人导航到链接,哈希值应与数据库中存储的值进行交叉检查,如果匹配,则拉取与该电子邮件相关的信息(即用户名,电子邮件)。当他们去填写表格时,你可以验证他们输入的数据是否兼容。

例如,如果用户忘记了他们的密码,只要他们输入他们的电子邮件地址,我将他们的密码重置为一个随机值(存储为散列),并将这个存储的散列用作URL参数重置电子邮件。

+0

Thx,我在想用户名保证它是唯一的?但由于我在散列中使用电子邮件,因此不应有冲突(电子邮件在注册时必须是唯一的)。 – Quadrant6 2012-03-30 02:02:52

+1

是的,我只是使用'md5(time()。$ user_id)'。如果你担心这个散列与另一个散列相同的奇怪机会,你可以使用'microtime()'而不是'time()'。 – hohner 2012-03-30 02:05:42

0

这应该没问题,我想补充说,一旦敏感页面被浏览过,第二次删除这些页面使用这个散列是一件好事 - 当你发送邮件时有散列存储在数据库中,查看页面时检查散列值是否存在,如果是,则允许页面查看,并从数据库中删除散列值,以便在第二次查看页面时检查失败。 (假设他们不需要从该电子邮件两次查看相同的链接)。

+0

Thx,在密码重置的情况下,我会在1次查看后删除它们。不确定:其他人虽然失效日期可能不错。 – Quadrant6 2012-03-30 02:04:56

+0

如果有东西会被多次查看 - 最好先让他们先登录,然后才能查看它,如果它真的很敏感。 – BenOfTheNorth 2012-03-30 02:06:10

+0

对,这是一个好点。 – Quadrant6 2012-03-30 02:10:46

相关问题