我没有找到任何好的参考资料,其中定义了身份验证的步骤(至少是步骤顺序)。
更具体地说,我感兴趣的是应该采取哪些步骤:
据我所知,在特定情况下,这些步骤的顺序并不那么重要,但一般来说,了解这些建议会很好。甚至为了为系统创建合适的用例。
例如,它可以以不同的方式设计:
系统只能提供用户名或密码不正确的一般信息。如果验证码不正确,则消息将相同。
系统可以提供更多不同的消息。例如,不正确的验证码将提供类似于“输入错误的验证码”的消息; 用户名或密码错误消息将是“用户名或密码不正确”。 (我不确定表单安全性是否正常)
问题是哪个用例更好? (最好通过适当的参数提供一些证据,证明这样做更好。)
答案 0 :(得分:0)
这取决于很多原因。但我会这样做:
<强>客户机侧强>
不要忘记此代码将是公开的,这意味着黑客会在执行攻击时看到此要求并将其记入帐户。
<强>了Serverside 强>
验证码。首先执行此操作,因为如果此操作失败,则无需使用您的数据库进行查找。(可能您在此处使用某种第三方服务)
用户名和密码检查,因为这是第二个最常见的失败。
凭据已过期或未过期且Credentails是暂时的或非暂时的,任何订单。
很高兴知道:
2和3也可能(取决于您的架构)在一个单一的数据库查找中完成。如果您使用SQL数据库,请不要忘记使用prepared statements。
如果有些东西可疑,你也可以做很多服务器端来检测攻击企图并限制权限。例如,X登录尝试失败后临时禁止用户帐户。存储IP地址并将其与位置匹配。例如,美国用户10分钟后从中国登录是可疑行为(Facebook和其他人这样做)。
确保您确切知道您在客户端和服务器端执行的操作以及执行顺序。一个好主意可以是绘制信息流图。并使用拦截代理查看发送的内容。是否明确发送密码?(使用ssl并在客户端哈希它们,而不是说你不再哈希它们(和盐)服务器端,以便该方法尽可能保密)