基于表单的网站身份验证
我们认为Stack Overflow不仅应该是非常具体的技术问题的资源,而且还应该是关于如何解决常见问题变化的一般指导原则。 “基于表单的网站身份验证”应该是这种实验的一个很好的主题。
它应包括以下主题:
- 如何登录
- 如何退出
- 如何保持登录状态
- 管理cookie(包括推荐设置)
- SSL / HTTPS加密
- 如何存储密码
- 使用秘密问题
- 忘记用户名/密码功能
- 使用nonce来防止跨站点请求伪造(CSRF)
- OpenID的
- “记住我”复选框
- 浏览器自动完成用户名和密码
- 秘密URL(受摘要保护的公共URL )
- 检查密码强度
- 电子邮件验证
- 还有更多关于 基于表单的身份验证 ...
它不应该包括以下内容:
- 角色和授权
- HTTP基本身份验证
请帮助我们:
- 建议子主题
- 提交有关此主题的好文章
- 编辑官方答案
#1楼
我只是觉得我会分享这个我发现工作得很好的解决方案。
我称之为Dummy Field (虽然我没有发明这个,所以不要相信我)。
简而言之:您只需将其插入<form>
并在验证时检查它是否为空:
<input type="text" name="email" style="display:none" />
诀窍是欺骗机器人认为必须将数据插入必填字段,这就是为什么我将输入命名为“电子邮件”。 如果您已经有一个名为email的字段,那么您应该尝试将虚拟字段命名为“company”,“phone”或“emailaddress”。 只需选择一些您不需要的东西,以及人们通常认为可以填写到网络表单中的东西。 现在使用CSS或JavaScript / jQuery隐藏input
字段 - 无论什么最适合你 - 只是不要将输入type
设置为hidden
,否则机器人不会为它而堕落。
当您验证表单(客户端或服务器端)时,检查您的虚拟字段是否已填满,以确定它是由人还是机器人发送的。
例:
如果是人:用户将看不到虚拟字段(在我的情况下命名为“email”)并且不会尝试填充它。 因此,在发送表单时,虚拟字段的值仍应为空。
在机器人的情况下:机器人将看到一个字段,其类型是text
和名称email
(或任何你称之为它),并将逻辑上尝试用适当的数据填充它。 如果您使用一些花哨的CSS设置输入表单的样式并不关心,Web开发人员会一直这样做。 无论虚拟字段中的值是什么,只要它大于0
字符,我们就不在乎。
我将这种方法与CAPTCHA结合使用在留言簿上,之后我没有看过任何一封垃圾邮件帖子。 我之前使用过CAPTCHA解决方案,但最终每小时产生了大约5个垃圾邮件。 在表单中添加虚拟字段已停止(至少到现在为止)所有垃圾邮件都会出现。
我相信这也可以用于登录/身份验证表单。
警告 :当然这种方法并非100%万无一失。 可以将机器人编程为忽略具有样式display:none
输入字段display:none
应用于它。 您还必须考虑使用某种形式的自动完成功能的人(比如大多数浏览器都内置了!)来自动填充所有表单字段。 他们可能也会选择一个虚拟场。
您也可以通过让虚拟区域可见但在屏幕边界之外可以稍微改变一下,但这完全取决于您。
要有创意!
#2楼
关于实际密码强度估计的好文章是:
Dropbox Tech Blog»博客存档»zxcvbn:真实的密码强度估算
#3楼
关于身份验证系统我最喜欢的规则:使用密码而不是密码。 容易记住,难以破解。 更多信息: 编码恐怖:密码与通行短语
#4楼
我想补充一点非常重要的评论: -
- “在公司 内部网络环境中,”如果不是所有上述内容都可能不适用!
许多公司部署“仅限内部使用”的网站,这些网站实际上是恰好通过URL实现的“公司应用程序”。 这些URL可以(据说......)仅在“公司内部网络”中解析。 (哪个网络神奇地包括所有与VPN连接的“公路战士”。)
当用户尽职地连接到上述网络时,他们的身份(“身份验证”) [已经......]最终知道,“他们允许(”授权“)做某些事情......例如。 ..“访问这个网站。”
这种“身份验证+授权”服务可以由几种不同的技术提供,例如LDAP (Microsoft OpenDirectory)或Kerberos。
从您的观点来看,您只需知道: 任何合法地在您的网站上结束的人必须伴随着[环境变量神奇地包含......]“令牌”。 ( 即没有这样的令牌必须是404 Not Found
直接理由。)
令牌的价值对你没有意义, 但是,如果需要,“存在适当的手段”,你的网站可以“[权威地]问一个知道(LDAP ......等)的人”关于任何一个(!)你可能有的问题。 换句话说,你没有利用任何 “本土逻辑”。 相反,你询问管理局并暗中信任其判决。
嗯......这是从很精神开关“野生和毛茸茸的互联网。”
#5楼
我想根据防御深度添加一个我用过的建议。 您不需要为常规用户提供与管理员相同的auth&auth系统。 您可以在单独的URL上使用单独的登录表单,为要授予高权限的请求执行单独的代码。 这个可以做出对普通用户来说完全痛苦的选择。 我使用的一个实际上是加密管理员访问的登录URL并通过电子邮件向管理员发送新URL。 立即停止任何暴力攻击,因为您的新URL可能是任意困难的(非常长的随机字符串),但您的管理员用户唯一的不便是在他们的电子邮件中跟踪链接。 攻击者不再知道POST到哪里。
#6楼
我不知道最好回答这个问题作为答案还是评论。 我选择了第一个选项。
关于第四部分:在第一个答案中忘记密码功能 ,我会指出时间攻击。
在“ 记住您的密码”表单中,攻击者可能会检查完整的电子邮件列表并检测哪些已注册到系统(请参阅下面的链接)。
关于遗忘密码表格,我想补充说,使用一些延迟功能在成功和不成功查询之间等于时间是个好主意。
https://crypto.stanford.edu/~dabo/papers/webtiming.pdf
#7楼
因为没有比没有做更有效的事情。
#8楼
第一部分:如何登录
我们假设您已经知道如何构建登录+密码HTML表单,该表单将值POST到服务器端的脚本以进行身份验证。 下面的部分将讨论声音实用auth的模式,以及如何避免最常见的安全陷阱。
HTTPS还是HTTPS?
除非连接已经安