如何验证用户点击我发送给他/她的电子邮件中的链接?

时间:2012-05-11 04:35:17

标签: java email authentication

这是由earlier posting here触发的更集中的问题。我需要通过证明用户可以访问它来验证用户的电子邮件地址。我在下面复制了一个您希望在加入开发者论坛或用户组时看到的通用电子邮件身份验证。作为注册过程的一部分,您需要提供您的电子邮件地址,然后您会收到一封电子邮件,要求您点击某些内容来验证您的电子邮件地址。

我需要对用户点击电子邮件中的链接时发生的任何事情进行编码。所以我的问题是 - 我该怎么做?

涉及哪些技术?任何人都可以带我走过这些台阶吗?我更喜欢像bash这样的Java或Linux脚本语言。更好的是,有没有为此目的开发的软件,我可以在我的Linux服务器上安装,并以某种方式集成它与我的数据库交谈?这在实践中是如何完成的?如果它已经可用,我不想重新发明一些东西。

To confirm your email address of: 

youremail@yourdomain.net 

please send a short reply to this address: 

users-sc.1496854427.ckdpbmhncdlkjadkajfpecc-mylist=yourdomain.net@listdomain.com 

Usually, this happens when you just hit the "reply" button. 
If this does not work, simply copy the address and paste it into 
the "To:" field of a new message. 

or click here: 
mailto:users-sc.1496854427.ckdpbmhncdlkjadkajfpecc-mylist=yourdomain.net@listdomain.com  

This confirmation serves two purposes. First, it verifies that I am able 
to get mail through to you. Second, it protects you in case someone 
forges a subscription request in your name. 

Some mail programs are broken and cannot handle long addresses. If you 
cannot reply to this request, instead send a message to 
<users-request@listdomain.com> and put the 
entire address listed above into the "Subject:" line. 

3 个答案:

答案 0 :(得分:5)

在您的用户数据库中,您需要有一个登台用户表(或在主用户表中添加一列,指示用户是否处于活动状态,并将指标默认为“否”)。当用户首次注册时,您可以从用户信息的一部分生成唯一的哈希码,例如在用户主键和名称上使用md5(或者通过解密可以获得的其他一组用户变量)。将此哈希码设置为您发送给用户的链接中的查询字符串参数。最后,当用户单击链接时,从查询字符串中获取哈希码,对其进行解密并将解密后的值与数据库中的用户行进行匹配。如果找到匹配项,请将“活动”指示符设置为true,然后将其设置为presto。或者,如果您使用了临时表,则将用户记录移动到用于执行授权的“活动用户”表。

答案 1 :(得分:3)

回复一封独特的电子邮件以验证某人的电子邮件是否存在固有缺陷,可以伪造(除非您检查标题和IP)。例如,我访问您的网站进行注册。你告诉我在users-sc.1496854427.ckdpbmhncdlkjadkajfpecc-mylist=yourdomain.net@listdomain.com回复。我使用垃圾邮件机器人的mail()函数进行回复。游戏结束。目的失败了。

相反,您可以在我的注册ID上向我发送验证链接。像example.com/verify?userid=1&hash=67gk65fs6714fgsHguj

这样的东西

在users表中:

id|username|status|onetimehash
--+--------+------+-------------------------
 1|testuser|    0 |67gk65fs6714fgsHguj

现在,在验证调用中检查userid和hash。如果它们与数据库中的值匹配,则可以安全地验证用户。为了生成散列,您可以将用户名的md5或sha1值与时间戳或某个随机数等盐混合使用。

<强>更新 如果您要使用以前的解决方案,即捕获用户对验证电子邮件的回复,则必须设置自己的邮件服务器。 Fetchmail可能会对您有所帮助。您必须以编程方式阅读电子邮件标头并从<to>,<from> or <subject>字段中提取所需信息。像userid = 1496854427和hash = ckdpbmhncdlkjadkajfpecc。您可能在此过程中需要正则表达式。一旦你有这些值,它非常简单,请根据数据库值检查它们。

底线是:前一种方法不仅繁琐,而且比后者更脆弱。大多数webapps使用第二种解决方案,因为它更清洁,更明智。

答案 2 :(得分:2)

我知道一个链接,其中包含 BalusC 的最佳答案 这是链接:better answer
我在我的项目中实现了这一点。希望这会有助于他人。