8

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

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

涉及哪些技术?任何人都可以引导我完成这些步骤吗?我更喜欢 Java 或 Linux 脚本语言,例如 bash。更好的是,是否有任何为此目的开发的软件可以安装在我的 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. 
4

3 回答 3

7

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

于 2012-05-11T04:50:29.377 回答
3

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

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

在用户表中:

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

现在,在您的验证调用中检查用户 ID 和哈希。如果它们与您的数据库中的值匹配,您可以安全地验证用户。为了生成哈希,您可以将用户名的 md5 或 sha1 值与一些盐(如时间戳)或一些随机数混合。

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

底线是:前一种方法不仅更乏味,而且比后者更容易受到攻击。大多数 webapps 使用第二种解决方案,因为它更干净、更明智。

于 2012-05-11T04:55:48.497 回答
2

我知道BalusC给出的最佳答案的
链接是链接:更好的答案
我已经在我的项目中实现了这一点。希望这对其他人有帮助。

于 2012-11-12T11:19:58.693 回答