【发布时间】:2014-03-01 22:00:07
【问题描述】:
当某人使用他们的电子邮件地址在网站上注册时,通常会要求他们通过单击发送到的电子邮件地址中的链接来验证或确认他们的电子邮件。订阅或取消订阅邮件列表也是如此。
在可用性方面,这很棒。它非常快速和容易做到,我想不出有什么比它更好的。
我不确定我是不是想太多了,但我只是想看看我是否遗漏了什么或误判了什么。
据我所知,电子邮件验证/确认的目的是
- 确保电子邮件地址正确
- 确保可以读取和接收发送到此地址的电子邮件
- 确保电子邮件地址确实属于尝试注册的人
由于当前流行的实施方式是只点击一个链接并立即验证电子邮件,因此有人可以暴力破解验证链接并绕过这整个步骤。
只需访问verify.php?code=YOURBESTGUESSHERE 并尝试各种不同的代码。
攻击者现在可以进行以下利用:
- 从我的邮件列表中退订一群人,伤害了我的生意
- 在未经他们同意的情况下将一群人添加到我的邮件列表中,因为他们可能对我的内容不感兴趣,他们可能会认为我是垃圾邮件并且生意不好
- 有人可以通过检查验证页面上的响应来农场地址(例如,如果响应是“mail@server.com 已验证”左右)
- 无需实际工作电子邮件地址即可创建虚假帐户
我不确定后者的好处是什么,而且为此目的创建一个丢弃地址似乎要容易得多,但我只是想把它放在那里以完成。
我的问题:
- 我是否错过了电子邮件验证/确认的任何其他目的或利用?
- 是否应该为电子邮件验证添加安全层,例如验证码或时间延迟以防止暴力破解?
- 除了重置代码之外,我还应该询问其他信息吗?再次喜欢用户名或电子邮件地址?还是安全问题类型的东西,或者他们在注册时输入的其他信息?
整个事情的最佳实践是什么,真正需要为此付出多少担忧和努力?风险与收益/安全与可用性...?
【问题讨论】:
-
也许您应该在security.stackexchange.com 上将其作为具体问题提出?
-
在撰写本文时,发送指向用户电子邮件的链接是不安全的(可能导致假冒),特别是如果您的用户可能使用 Gmail 发送电子邮件或使用 Chrome 浏览器(Chrome、Chromium、 Microsft Edge、Brave Browser、DuckDuckGo Browser 都使用 chrome 引擎)。更喜欢将代码发送到用户电子邮件,如果您必须发送链接,请确保您有一个专用页面来处理需要用户操作(如点击)或需要 JavaScript 运行的确认页面并将代码发送到您的服务器。阅读更多:stackoverflow.com/a/63427303/3563013