生成电子邮件验证链接

问题描述:

对于Web应用程序我想生成一个电子邮件验证链接并将其发送给用户。像许多公共网站一样,用户应该点击它来验证他的电子邮件地址。类似于此:生成电子邮件验证链接

http://www.foo.bar/validation?code=421affe123j4h141k2l3bjkbf43134kjbfkl34bfk3b4fkjb43ffe

任何人可以帮我约昭穆这些验证令牌的一些提示?谷歌搜索的最佳实践结果比我想象的要困难得多。链接应该:

  • ...不要求用户先登录。
  • ...不透露任何登录凭据以保持应用程序安全
  • ...允许我作为开发人员有效验证令牌。我很确定我需要一种方法从代码中提取用户标识符以符合此标准。不是吗?

此外,你会去随机代码,这是保存在某处,或生成的代码,我可以重新计算验证?

感谢您的回复!

Matthias

P.S.我正在使用ASP.NET 3.5,以防有这种功能的开箱即用。

一些建议,让你开始:

  • 使用GUID的
  • 使用某种咸散列(MD5,SHA1等)
  • 使用字符的随机字符串(多个字符越少可能你就会有冲突)
  • 存储在数据库中暂时,并使其在一定的时间段后到期时间戳记它
+1

+1良好且完整的答案 – 2009-07-14 13:46:22

我可能会使用Guid。只需创建一个Guid(通过调用Guid.NewGuid()),将其存储为该用户的验证令牌,并将其包含在验证链接中。

最简单的方法是生成一个GUID,将其存储在数据库中,将其绑定到他们的用户帐户,然后给他们一个时间范围,在该时间范围内点击一个带有该GUID的链接。

验证它们是正确的人没有使URL可计算,同时使其抵御字典式的攻击。

我构建了散列,可以重新创建一个方法:

code = MD5(my_hash + user_email + register_timestamp) 

然后把链接发给http://example.com/validation/?code = 4kj34 ....

验证进行查找,如:

SELECT id 
FROM users 
WHERE 
    MD5(CONCAT(my_hash, user_email, register_timestamp)) = code 
    AND activated = 0 

如果您得到单个结果,请更新其“激活”字段并签名。您也可以在他们的'register_timestamp'字段中为穷人的TTL做一些数学运算。