本文共 6241 字,大约阅读时间需要 20 分钟。
- 原文地址:
- 原文作者:
- 译文出自:
- 本文永久链接:
- 译者:
- 校对者:
近期发表了一篇题为『』的博文。文章对于「你的网站应该使用什么样的密码规则」给予了很多实用的建议,而通过参考权威机构的建议总是有助于说服同事或老板。
我在 Google 工作期间从事过的一个项目就是他们的统一账户系统()。大多数网站都会有一个登录系统,阅读 Troy 的文章极大地启发了我去建立这样的一个系统,从而将那些建议应用其中。
不管是什么业务,进行用户认证并不是你的主职,现代登录系统需要考虑的有很多,密码只是一个开始。如果你成功建立了账户,最终还得考虑:
随着大公司对用户验证意识的提高和攻击者的攻击能力的提升,一成不变的验证技术已经不符合时代的变化。幸运的是,你现在可以将你的身份验证环节外包给那些支持 OAuth 协议的公司。
Web 开发者常常会在建立完自己的账户系统之后,才觉得添加或是个不错的方案。如果你是为了建立一个全新的网站而阅读这篇文章,我建议『使用第三方登录』应该成为你的网站的唯一选项。如今,建立自己的账户系统就像是建立自己的数据中心,而不是使用 AWS。
人们有时候会担心,如果只提供『第三方登录』按钮用来登录,那么那些大型的 ID 提供商可能会试图窃取他们的客户。通常情况下,人们担心的情况是,使用 ID 提供商登录,但是却被要求设置密码。其实不用担心这一点,这种情况不太可能发生,就算真的发生了,你也随时可以通过电子邮件给他们发送一个链接将你的客户群迁移到你自己的系统上。
不要强制用户设置用户名,即使你的业务体验是基于用户名的,比如聊天论坛之类的。用户通常是通过邮箱或者是电话抑或是两者同时验证的,如果你想让每个用户都拥有一个独一无二的用户名(用来展示的),那应该单独选择,为什么呢?
如果你还没准备好将账户系统完全依赖于第三方 ID 提供商,那么千万不要设置密码,这样对每个人都有好处。
这个主意并不像它听起来那么愚蠢。你已经向用户询问他们的电子邮箱了,你所应该在你的登录系统上添加的第一个功能就是用户忘记密码后该如何恢复,你可以通过电子邮件给用户发送一个可点击的链接。这样,只要用户能够使用该邮箱就能够登录你的系统,而你的网站密码也用不着增加额外的安全性。
我们跳过这一步,直接进入下一步,取而代之的——你的登录系统可以变得更简单,只需通过邮件向用户发送一封包含了登录cookie的链接,用户只需点击链接便能登录。。
通过这种方法,只要用户的设备装有电子邮件客户端,就能够登录。对于台式机、笔记本电脑、手机和平板来说也是如此。对于游戏机和电视来说可能行不通,不过你的目标用户可能不是这些人群。其中的匹配过程最好用蓝牙的方式,因为这些设备没有方便使用的键盘。
过去常常有这样的说法:缺少密码输入框会使用户感到不自在。而现代的谷歌登录体验正是如此,他们仅仅要求用户输入他们的电子邮箱地址,所以用户并不会感到有什么不自在,而且这么做还大有好处。
而这种方法还有个好处:有些人只有电话号码而没有电子邮箱。在发展中国家尤其如此,所以如果这些国家的用户是你的网站的潜在目标市场的话,最终你可能要支持仅能通过手机接受验证码的方式登录。这样的账户根本就不需要密码,如果你所有的用户都有密码,那么你需要返回并为安全敏感的代码路径添加许多特殊的情况(这很容易导致致命的错误)。
如果你就是想使用密码——大概你懒得向你的老板解释为什么你这么特立独行,那么请至少不要让用户通过密保问题来找回他们的密码。
Google 曾经在密保问题上遇到过严重的问题。,值得一看(视频在下面,来自 youtube)。
一场在谷歌进行的关于密保问题和答案的谈话
这是一些问答的例子:
专业的账户系统是不会单独使用密保问题来允许用户恢复密码的。它仅仅只是一种参考。我只给予你小于 2% 的机会去通过一个足够复杂的机制来获得这个权利。这就是为什么 Google 逐步淘汰密保问题而采用短信的方式来恢复密码。当然短信恢复自身也存在一些问题,但相比于密保问题还是好很多的。
验证码是许多登录表单的常见功能。我在 Google 期间也做了一些相关的工作。但是,在如今验证码几乎没有什么价值,而且执行率非常之低。
这些验证码都无济于事。
首先要正确理解验证码的作用,它们仅仅对自动化攻击施加非常简单的限制。他们并不会保护你的账户系统免于批量注册的风险。除了账户安全,我还花了几年时间研究 Google 的注册滥用。我们亲眼看到垃圾邮件发送者轻松地解决了数千万个那些我们认为很难的验证码。有那些专业处理验证码的公司,如 ,他们使用的是光学字符识别和人工识别。普通的验证码让盲人用户无法进行注册,这确实是个问题。而基于语音的验证识别对于机器很容易,对人来说却很困难。
使用验证码阻止暴力破解密码是很有帮助的。暴力破解一个账户的密码,可能需要成百上千次的尝试,一个简单的方法来阻止这种现象是在他们经过了几次失败的尝试之后就开始加入验证码。在机械的循环中,即使是使用一个简单的验证码来延缓进程也足够了。
对于阻止批量账户注册,验证码却不太管用。建立一个系统去检测和阻止这类现象是另一桩工作,在这方面我也花了好几年的时间。你可以大致了解一下这有多困难,登录 并对比一下黑市账户销售商收取的巨大差价。防御系统较好的网站的账户通常会收取更高的价格。除非你是 Big 5 之一,不然在注册安全方面,你所做的不可能超过我们,这也是我建议你将登录系统外包给那几家主要的公司的另一个原因。
如果你仍然想要使用验证码,请使用 并确保你的验证码放置在了适当的位置,以免重放攻击。不要尝试使用你自己制作的或是你在 GitHub 上找到的工具包,这样的验证码很容易被现代的光学字符识别所解决,除了降低客户注册的成功率之外并没有什么用处。
如今双因子验证是一个很常见的功能。然而,把它做好却是很困难的,而且花费不菲,你不会想自己动手去实现它的。
其中一些问题是很根本的,但是大多数已经有人帮你解决了,他们将免费为你支付电话费和客户支持人员
不过,如果你仍然不想使用他们提供的服务,那么还有一些创业公司可以为你解决小部分的双因子验证难题。
Troy 已经把这一点解释的很好了,我这里就不再赘述,但还要再强调一遍,这很重要。不要仅仅是因为用户的密码已经使用一段时间了,就让用户更改密码。
是的,这又是个不好的『最佳实践』。人们常常会为会话 cookie 设置有效期,觉得这样做增加了安全性,出于同样的原因,人们会认为为密码设置有效期也会增加安全性。
在不成熟的账户系统中,登出错误是非常常见的。这听起来很简单,但是实现这一功能的公认方法,是有缺陷的。
正确的方法是使用内存中缓存来保存过期会话 cookie 的列表。但是,对于大多数公司来说,有个成本更低而且足够好的替代方案:让用户的退出链接仅仅当作是清除会话 cookie 的一种方式,紧接着可以让会话 cookie 过期,并且每隔5分钟自动更新。替换过期会话 cookie 的行为可以通过查询数据库,以查看管理员是否强制注销了该账户。如果用户显示的是过期的 cookie,则需要重新登录。这就意味着 cookie 清理之后就不太可能被盗用了。
一般我们会用公司的主要电子邮箱服务器来给用户发送恢复密码链接、登录验证等信息。然而,贵公司的一些人却会通过给用户发送那些他们不想收到的商业邮件与用户建立『联系』。
即使用户同意在帐号注册期间收到这类信息,但其中大部分用户却不想再收到这样的信息,有些人甚至会将其举报为垃圾邮件。那些精明的用户知道,这是一个极其方便的解决方案,仅仅简单地点击『举报垃圾邮件』,就能让这些令人讨厌的电子邮件消失,而不必把精力花费在寻找用微小字体写着的『取消订阅』链接,或是劳神费力地写电子邮件过滤器。
而不幸的是,这类行为将会降低你的电子邮件域名的信誉。从你的帐户系统发送的邮件最终很可能会进入用户的垃圾邮件文件夹。我们在注册或进行密码恢复的流程中,都能看到这类让我们检查垃圾邮件文件夹的提示 —— 就是这个原因。
解决这个问题的一种方法是,购买单独的顶级域名来发送邮件,并确保符合电子邮件验证标准。但是,一些用户可能会注意到域名不匹配,从而将你的电子邮件举报为网络钓鱼。最佳方案是使用不同电子邮件验证标准的域名发送你的营销邮件,但你的产品人员可能不认可。所以,还是那句话,你选择自己干的那一刻,也同时承担了痛苦。
一旦你拥有了密码,你的数据库就成了攻击者的目标(而且他们常常能得手)。他们对你的公司并不感兴趣,他们只是想要密码,以方便他们尝试那些更高价值目标。所以,数据泄露是个严重的问题,也许对客户的直接影响没那么大,但有可能导致严重的后果。而使用 OAuth 协议的数据库对于攻击者来说却没什么价值, 因此不太可能受到攻击。
关于帐户系统我还能写好多东西。保护你的网站,使其免受恶意帐户入侵或注册,这方面内容可以单独写成一本书了。这书我写不了,不过如果你有兴趣的话,可以看看这个视频,这是我在 。
老实说,这看似是一个浩大的工程,实则并非如此。所以我一直建议你要硬着头皮坚持做下去,并且把你的账户管理外包给那些大公司。因为,你的主要业务并不是去操心怎样摆弄验证码、不是怎样写『登出』的设计文档、不是诊断为什么你会流失那些忘记密码的用户、也不是去考虑为什么发送信息到秘鲁会不稳定。你在这些事情上花费的每一分钱,对于那些提供了『使用第三方登录』的竞争对手来说,他们将这些钱都花在了他们的核心业务上。
所以,不要回头看了,放弃你的密码数据库吧。
转载地址:http://fbtta.baihongyu.com/