2014-03-01 108 views
3

当有人在网站上用他们的电子邮件地址注册时,他们通常会被要求通过点击他们发送到的电子邮件地址中的链接来验证或确认他们的电子邮件。订阅或取消订阅邮件列表也一样。电子邮件验证/确认安全

可用性明智,这是伟大的。这是非常快速和容易的事情,我想不出任何会打败它的东西。

我不确定自己是否在推翻事物,但我只是想看看我是否遗漏了任何东西或者误判了任何事情。

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

  • 为了确保电子邮件地址是正确的
  • 要发送到该地址确保电子邮件可阅读并接受
  • 为了确保电子邮件地址确实属于谁的尝试注册

随着CURR的人只需一个他们点击链接的流行实现,并立即验证电子邮件,有人可能只是强制验证链接并绕过这整个步骤。

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

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

  • 从我的邮件列表退订一堆人
  • 一堆人加入到我的邮件列表中没有他们的同意伤了我的生意,因为他们可能对我的内容不感兴趣,他们可能会认为我是垃圾邮件并且生意不好
  • 有人可以通过检查验证页面上的响应来寻址地址(例如,如果响应是“[email protected]”已经验证“左右)
  • 有人可以制造假账户,而不需要具有实际工作电子邮件地址

我不知道后者的好处是什么,似乎这将是更容易,只需创建一个罚球为了这个目的,我只是想把它放在那里完成。

我的问题:

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

这整件事情的最佳实践是什么,需要付出多大的担心和努力?风险与收益/安全与可用性...?

+2

也许你应该问这是关于http://security.stackexchange.com的具体问题? – SilverlightFox

回答

5

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

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

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

+0

给代码过期有什么好处吗?我明白为什么这是重置密码所必需的,但对于电子邮件确认,我想不出一个没有到期的代码会成为问题的情况。 –

+0

@JoshNoe,即将到期的幻数允许您从数据库中清除它们,避免了DoS的另一个潜在途径。 – mlp

2

如果需要,您可以随时增加安全性。考虑将链接与唯一代码结合起来。所以当暴力破解允许找到一个链接时,他们仍然需要从电子邮件中输入一个随机代码。

像尝试次数这样的建议将是我会首先执行的一项建议,以避免系统问题(请求数)而不是安全性。