【问题标题】:Security for Email verification/confirmation [closed]电子邮件验证/确认的安全性[关闭]
【发布时间】: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

标签: security email usability


【解决方案1】:

如果攻击者对YOURBESTGUESSHERE 的搜索空间足够大,暴力破解就变得不可行。使用{a code derived from {email address plus timestamp}(可能包含任意其他内容,例如随机 nonce,并入)},通过已知良好的单向哈希函数的已知良好实现提供。

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

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

【讨论】:

  • 给代码一个过期时间有什么好处吗?我理解为什么这对于重置密码代码是必要的,但对于电子邮件确认,我想不出一个未过期的代码会成为问题的情况。
  • @JoshNoe,过期的幻数可让您从数据库中清除它们,避免另一个潜在的 DoS 途径。
  • @mlp 这是我正在努力解决的一件事:你如何对代码设置时间限制,然后从数据库中清除它们?!请帮忙
  • @Anthony,当您生成幻数时,将其及其到期时间插入数据库。出现代码时,如果它存在于数据库中,则允许访问(并可选择从数据库中删除该代码)。定期(每小时/每天/每周/任何时间)运行一个查询,删除过期时间为“现在之前”的任何条目。
  • @mlp 所以我想通了。我正在做的是使用 2 张表,一张用于未验证,一张用于验证。一旦用户通过单击链接激活他们的帐户,我将必要的信息转移到已验证的表并删除未验证表中的条目。有没有办法自动化每小时/每天/每周/等查询?
【解决方案2】:

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

尝试次数等建议将是我首先实施的建议之一,以避免系统问题(请求数量)而不是安全问题。

【讨论】:

    猜你喜欢
    • 2016-05-21
    • 1970-01-01
    • 2014-10-17
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多