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

时间:2014-03-01 22:00:07

标签: security email usability

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

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

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

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

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

目前流行实现的只需一个链接即可点击并立即验证电子邮件,有人可能会强行执行验证链接并绕过整个步骤。

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

攻击者现在可以进行以下攻击

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

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

我的问题:

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

这整个事情的最佳做法是什么,真正需要付出多少担忧和努力?风险与利益/安全性与可用性......

2 个答案:

答案 0 :(得分:6)

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

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

在呈现代码时不要泄露信息 - 代码的真实用户知道它适用于哪个电子邮件地址,而其他任何人都不需要。

答案 1 :(得分:2)

如果需要,您可以随时提高安全性。考虑将链接与唯一代码相结合。因此,当蛮力允许找到链接时,他们仍然需要从电子邮件中输入随机代码。

尝试次数的建议将是我要实施的第一个,以避免系统问题(请求数量)而不是安全性。