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

问题描述 投票:6回答:7

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

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

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

php security registration email-verification
7个回答
9
投票

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

Email verification

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

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

Turing test

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

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

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

Bottom line

最重要的是,使用任何停止僵硬的技术将始终是一个妥协,即机器人所有者(垃圾邮件发送者或任何想要在您的系统中注册大量用户的人)愿意花多少时间,努力和金钱去做,以及你会容忍给你的用户带来多少不便,因为最终你永远无法做任何自动化测试来告诉人类和机器人分开而不会实际上惹恼人类并疏远残疾人(有任何人试图猜测reCAPTCHA的音频版本?),你的机器人实际上可能仍然是人力驱动的,所以不是机器人,而是机器人,可以这么说。

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


3
投票

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

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


1
投票

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

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

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

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


1
投票

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

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

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


1
投票

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

  1. 电子邮件验证
  2. 验证码
  3. 简单的随机问题(大多数人都有多少只耳朵/手指?)
  4. 通过短信发送代码的手机号码

最后一个可能被证明是最好的消除机器人,但它也将限制谁注册您的网站。此外,您拥有的验证越多,您对用户的骚扰就越多,您就越会增加让他们注册的障碍,这也可能是一个非常大的缺点。就个人而言,我认为验证码是机器人保护与用户不便之间的良好平衡。


1
投票

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

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

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

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

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

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

DC

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

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

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

DC


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.