Web登录/身份验证的最佳做法?

时间:2008-11-14 18:27:00

标签: authentication

为网站的用户身份验证部分编写代码(包括帐户注册,登录和密码重置)非常简单,但是您需要做什么才能真正实现良好的用户身份验证设置?例如,我认为不存储明文密码是网站的最低要求,但这条建议似乎主要是通过口口相传传播的,而且很多网站仍然无法遵循它。

对网站的用户身份验证部分有什么其他好的建议或好的要求?例如,用户名是应该由用户选择,还是应该是电子邮件地址?用户注册部分的任何陷阱? (CAPTCHAs本身可能值得一个完整的主题。)密码重置部分的任何陷阱?还有什么吗?

编辑:

这里有些重复:best-practices-for-login-pages

5 个答案:

答案 0 :(得分:20)

<强>加密

昨天有一个问题 - “Why should I care about hashing passwords anyway?”,其中涵盖了为什么要这样做的所有原因。

<强>验证码

我不同意里卡多关于验证码的观点 - 总是需要验证码,甚至真正不受欢迎的网站也会被垃圾邮件发送者所瞄准。我设置了一些博客来测试一些我从未与垃圾邮件发送者奇迹般发现的其他地方相关联的代码。当一个垃圾邮件发送者为你的网站充斥着数以万计的关于伟哥的相同帖子时,你会后悔没有花费额外的20分钟来安装验证码。 reCaptcha有一些plugins使得安装非常简单,你可以帮助他们挖掘书籍。

不要忘记视力不佳的用户需要音频验证码。

忘记密码

如果您已确认用户的电子邮件地址,则可以为他们生成随机的新密码。确保提示他们立即更改密码,因为人们会立即忘记随机生成的密码。

<强>电子邮件

不要试图实现涵盖所有可能的电子邮件地址的复杂正则表达式。做一个简单的@检查,然后让用户点击发送到他们的电子邮件地址的链接进行验证。这是现在常见的做法,但我仍然遇到过试图让人“聪明”的人。

表单验证

除了您在注册表单上的服务器端验证之外,您还应该以AJAX的形式进行客户端验证,以便让用户知道他们是否填写了他们选择的用户名,他们的密码是否可以接受,用户可能会因为不得不多次重新提交注册表而感到沮丧。

身份验证本身

让人们使用他们的用户名或电子邮件地址登录是件好事,因为人们更容易记住电子邮件地址而不是用户名,特别是如果他们有一段时间没有访问过您的网站。

如果您的网站需要增加安全性(例如,如果您正在销售内容而人们只需登录即可获取),请索取其他信息。询问他们的邮政编码是一个好主意,因为它只需要几秒钟的时间来输入并使暴力密码变得更加困难。

答案 1 :(得分:3)

在用户名主题上,它取决于用户名在网站上的使用方式(登录后除外)。如果您的网站基于用户生成的内容,并且您显示包含内容的用户名,则允许用户选择自己的内容并确保其不是电子邮件地址。此外,如果显示用户名,我通常会在注册表上提供一些警告,让用户知道,因此他们不会使用他们的全名,只会在网站上显示后生气。< / p>

我建议用户在表单上时通过某种类型的Ajax调用来检查用户名的可用性和有效性。让表单重新加载密码和密码确认消失了,只需要想到一个新的用户名并重新输入数据就很痛苦。

要考虑的其他事项是强制执行最小/最大长度以及围绕密码的一些规则......不要让注册变得困难。此外,接受密码中的特殊字符。我有几个非常强大的密码,我喜欢使用它们,很多网站都不允许我使用它们,因此我的帐户最终不如我自己制作的那么安全。

CAPTCHA是一个好主意,只要确保它不是很难找出来,这也可能令人沮丧。

有很多事情要考虑,每个都有几个选项,但希望这会让你开始。

答案 2 :(得分:2)

请确保您的登录页面使用SSL加以保护,否则,无论如何都会以明文形式通过互联网发送用户名和密码。如果其他地方没有敏感信息,则您的网站其余部分不需要受SSL保护。

答案 3 :(得分:2)

我会说你使用了许多广泛使用的社交网络API来为你完成这项工作。通过这样做,您将能够在登录和用户身份验证(读取密码和用户数据)方面完全减轻您的页面中的许多安全漏洞,并将其传递给所述社交网络的稳定手中。

  

由于整个过程可以通过点击一个完成   按钮,它还使您的用户体验更好,并可以顺利集成   进入你的用户界面。

此类API的一些例子是Facebook,Google,LinkedIn,Twitter,Dribbble。根据您对目标用户群的想法选择您的。

  

另外,根据我最近的经验,hello.js框架就是这样做的   任务很简单。

答案 4 :(得分:0)

MSDN发表了一篇涉及其中一些问题的文章;副本可用here。大多数建议反映了这里的想法;该文章的另一个想法是“通过您的注册渠道跟踪流量”。跟踪系统的错误,警告和恢复部分的命中,以查看是否需要进行一些可用性增强。