电子邮件验证链接是个坏主意

时间:2011-03-01 00:03:41

标签: php security registration email-verification

在我的注册过程中,用户注册,他们会通过电子邮件发送验证链接,如果他们点击它,那么他们的帐户才会被验证。但这种验证方法对于僵尸程序来说不是太容易了吗?

我认为电子邮件可以由机器人创建,但是如果验证只是点击链接,它也可以由机器人自动完成。我不确定,因为我没有这样做而且不关心测试它只是为了知道,但我的问题是这个验证方法是不是有缺陷?

我正在考虑将验证码作为文本发送给用户,他们必须手动将其复制/粘贴到表单中,并且表单受验证码保护。这是一个更好的主意吗?有任何缺陷吗?

7 个答案:

答案 0 :(得分:9)

大多数建议都是关于验证电子邮件和使用CAPTCHA,当然您应该这样做,但请记住,这些方法都不是完全无懈可击的。

电子邮件验证

机器人可以轻松地“点击”任何电子邮件中的链接。复制和粘贴某些内容对于机器人作者来说会稍微烦人但不多。通常,电子邮件验证只是 - 电子邮件验证。

您验证电子邮件是否可能由尝试注册的人控制,但当然,因为电子邮件通常是通过不受信任的TCP以明文形式发送并依赖于不安全的DNS,然后直到我们都使用DNSSEC并加密所有流量它很容易嗅到电子邮件和恶搞服务器和客户端。需要注意的重要一点是,使用电子邮件验证,您只能获得一定程度的信心,即您与之交谈的任何人或其他任何人都是该电子邮件地址的用户。

图灵测试

回答只有人应该知道答案的问题仍然会更烦人,但考虑到你可能不会有无数问题,机器人作者可能会将未知问题重定向到真正的人类并使用缓存的答案,如果任何问题不止一次重复。像我最近在一些网站上看到的“什么是12 + 8”这样的问题作为图灵测试是完全适得其反的,因为这个问题对于机器人来说实际上比人类更容易 。可能最受欢迎的图灵测试是CAPTCHA,但在这里你也必须意识到它们可能被愚弄。

首先,人们正在展示绕过CAPTCHA的方法,例如参见DEFCON 18的解码reCAPTCHA 谈话。许多CAPTCHA对机器人来说更容易解密,因为它们是由微不足道的算法生成的扭转。 reCAPTCHA扭曲也很简单,但他们使用的单词是真正的扫描单词,对于OCR来说很难,所以原则上它对于机器人来说应该更难,但情况并非总是如此。

还有可能在其他网站上显示您想要猜测的验证码,让人们为您解答。还有一个黑人市场实际上正在解决验证码所以如果你的机器人作者不介意支付十几美分,那么无论人类有多难,真正的人类会解决它反正。

底线

最重要的是,使用任何停止使用机器人的技术总是会影响机器人所有者(垃圾邮件发送者或任何想要在系统中注册大量用户的人)愿意花多少钱。这样做的时间,精力和金钱,以及你会容忍多少给你的用户造成的不便,因为最终你永远无法做任何自动测试来告诉人类和机器人,而不会真正讨厌人类并疏远残疾人(有没有人试图猜测reCAPTCHA的音频版本?),你的机器人实际上可能仍然是人力驱动的,所以不是机器人,而是机器人,可以这么说。

这是一场军备竞赛,诚实的用户正在为此付出代价。请记住所有这些。

答案 1 :(得分:3)

问题是你想要验证的是什么?当您向电子邮件地址发送链接时,您可以知道注册该帐户的任何人都可以访问该电子邮件地址。除此之外,它没有告诉你关于它们的任何信息。

所以是的,机器人可以创建一个帐户,并将其用于注册。如果你想停止机器人,那么,验证码是你需要添加的。请注意,添加代码进行复制/粘贴没有什么意义 - 这对于机器人来说既容易,也不会在验证码上获得任何东西。

答案 2 :(得分:1)

与往常一样,安全性和便利性通常相互竞争。

电子邮件中的链接只是验证它是有效的电子邮件地址。是的,机器人很容易处理这个问题。但是你的服务是如此有价值,机器人会攻击它吗?

CAPTCHA始终是确保用户为人的方式。与之相关的额外编码和挫折是一种权衡。

最后,尽量保持简单,但并不简单。

答案 3 :(得分:1)

正如已经指出的那样,你只需要一些CAPTCHA验证。

我的建议是在您的应用创建用户帐户并发送验证电子邮件之前进行人工验证。您的网站的附加值不能轻易被强制为垃圾邮件验证电子邮件,并且会伪造等待验证帐户。

如果你这样做,链接没有错。

答案 4 :(得分:1)

是的,机器人可以输入电子邮件并检查回复。我也听说过努力让机器人在图像识别和回答验证码方面做得更好,尽管我不能确定它们有多好。如果你真的很担心,我会选择:

  1. 电子邮件验证
  2. 验证码
  3. 简单的随机问题(大多数人都有多少只耳朵/手指?)
  4. 通过短信发送代码的手机号码
  5. 最后一个可能被证明是最好的消除机器人,但它也将限制谁注册您的网站。此外,您拥有的验证越多,您对用户的骚扰就越多,您就越会增加让他们注册的障碍,这也可能是一个非常大的缺点。就个人而言,我认为验证码是机器人防护与用户不便之间的良好平衡。

答案 5 :(得分:1)

您是仅验证电子邮件还是进行完整注册?

我总是先验证电子邮件帐户。然后一旦验证完成注册过程。

所以在验证电子邮件步骤添加验证码。

换句话说,要求用户输入他们的电子邮件地址,输入验证码并提交表格。

这样只有真人才能收到验证邮件。

当然不会阻止人体机器人。

DC

这也意味着您不需要存储失败/错误的注册数据。

一个问题是用户使用一个电子邮件地址进行验证,然后在注册过程中进行更改,我会这样处理..

当用户提交其电子邮件地址时,数据根本不会存储。相反,我使用$validation_code = md5(trim($email)+$secret)生成验证码。这样他们就无法更改实际注册表单上的电子邮件地址。电子邮件和验证码作为隐藏字段传送到最后以验证电子邮件地址。如果电子邮件地址已经过验证,则注册将失败,因为md5不再匹配。

DC

答案 6 :(得分:0)

我在验证电子邮件和测试方面遇到了类似的问题。如果您想要端到端测试电子邮件验证,请尝试EmailE2E.com - 它是免费的。

您可以通过API发送和接收来自随机生成的收件箱的电子邮件。

它非常适合测试Firebase,Amazon Cognito或其他在注册过程中使用电子邮件验证码的OAuth提供商。此外,它还拥有Java和JS客户端。