电子邮件验证/确认的安全性

oll*_*lli 4 security email usability

当有人在网站上注册他们的电子邮件地址时,通常会要求他们通过点击发送给他们的电子邮件地址中的链接来验证或确认他们的电子邮件.订阅或取消订阅邮件列表也是如此.

可用性明智,这很好.这是非常快速和容易做到的,我想不出任何能打败它的东西.

我不确定我是不是在想事情,但我只是想看看我是否遗漏了什么或误判了什么.

据我所知,电子邮件验证/确认的目的

  • 确保电子邮件地址正确无误
  • 确保可以读取和接收发送到此地址的电子邮件
  • 确保电子邮件地址确实属于尝试注册的人

通过他们点击的当前流行实现只有一个链接并立即验证电子邮件,有人可以强制执行验证链接并绕过整个步骤.

只需访问verify.php?code=YOURBESTGUESSHERE并尝试各种不同的代码.

攻击者现在就可以做如下的剥削:

  • 通过从我的邮件列表中取消订阅一群人来伤害我的业务
  • 在未经他们同意的情况下将一堆人添加到我的邮件列表中,因为他们可能对我的内容不感兴趣,他们可能会认为我是垃圾邮件而且是一个糟糕的业务
  • 有人可以通过检查验证页面上的响应来设置地址(例如,如果响应是"mail@server.com已经过验证"等)
  • 有人可以创建虚假帐户,而无需拥有实际工作的电子邮件地址

我不确定后者的好处是什么,似乎为此目的创建一个丢弃地址要容易得多,但我只是想把它放在那里完成.

我的问题:

  • 我是否错过了电子邮件验证/确认的任何其他目的或利用
  • 我是否应该在电子邮件验证中添加安全层,例如验证码或时间延迟以防止暴力破解?
  • 我应该要求除重置代码以外的其他信息吗?像用户名或电子邮件地址一样?或者是安全问题类型的东西,还是他们在注册时输入的另一条信息?

这整件事的最佳实践是什么,真正需要付出多少顾虑和努力呢?风险与利益/安全与可用性......?

mlp*_*mlp 7

如果攻击者的搜索空间YOURBESTGUESSHERE足够大,暴力就变得不可行了.使用从电子邮件地址派生的代码加上通过已知良好的单向散列函数的已知良好实现提供的时间戳.

确保代码仅在使用后的短时间内(可能是几天).

在呈现代码时不要泄漏信息 - 代码的真实用户知道它适用于哪个电子邮件地址,并且没有其他人需要.