不要重置用户的暗码。因为这有大概让用户的暗码遭到恶意进攻。虽然,你要发个邮件给用户让其确认,用户点击邮件中的一个链接,你再重置。我并不推荐这样的要领,因为用户一般城市用条记下来这个很难记的口令,然后登录系统,因为登录系统时利用了“记着暗码”的成果,所以导致用户不会去修改暗码,从而要么导到被写下来的暗码被人偷取,要么又健忘了暗码。
好一点的做法——通过邮件自行重置。当用户申请找回口令成果的时候,系统生成一个MD5独一的随机字串(可通过UID+IP+timestamp+随机数),放在数据库中,然后配置上时限(好比1小时内),给用户发一个邮件,这个毗连中包括谁人MD5的字串的链接,用户通过点击谁人链接来本身从头配置新的口令。
更好一点的做法——多重认证。好比:通过手机+邮件的方法让用户输入验证码。手机+邮件大概还不掌握,因为手秘密能会丢了,而我的手机可以会见我的邮箱。所以,利用U盾,SecureID(一个会变革的6位数token),或是通过人工的方法核实用户身份。虽然,这主要看你的系统的安详级别了。
口令探测防守利用验证码。验证码是靠山随机发生的一个短暂的验证码,这个验证码一般是一个计较机很难识此外图片。这样就可以防备以措施的方法来实验用户的口令。事实证明,这是最简朴也最有效的方法。虽然,老是让用户输入那些肉眼都看不清的验证码的用户体验欠好,所以,可以折中一下。好比Google,当他发明一个IP地点发出大量的搜索后,其会要求你输入验证码。当他发明同一个IP注册了3个以上的gmail邮箱后,他需要给你发短信方法或是电话方法的验证码。
用户口令失败次数。调置口令失败的上限,假如失败过多,则把帐号锁了,需要用户以找回口令的方法来从头激活帐号。可是,这个成果大概会被恶意人利用。最好的要领是,增加其实验的时间本钱(以前的这篇文章说过一个增加时间本钱的解密算法)。如,两次口令实验的隔断是5秒钟。三次以上错误,帐号被姑且锁上30秒,5次以上帐号被锁1分钟,10次以上错误帐号被锁4小时……可是这会导致恶意用户用脚原来进攻,所以最好再加上验证码,验证码堕落次数过多不克制登录而是禁lP。
系统全局防守。上述的防守只针对某一个体用户。恶意者们深知这一点,所以,他们一般会动用“僵尸网络”轮着实验一堆用户的口令,所以上述的那种要领大概还不足好。我们需要在系统全局域上监控所有的口令失败的次数。虽然,这个需要我们平时没有受到进攻时的数据做为支持。好比你的系统,平均天天有5000次的口令错误的事件,那么你可以认为,当口令错误大幅高出这个数后,并且时间相对会合,就说明有黑客进攻。这个时候你怎么办?一般最常见利用的要领是让所有的用户输错口令后再次实验的时间本钱增加。
最后,再说一下,关于用户登录,利用第三方的 OAuth 和 OpenID 也不失为一个很不错的选择。
参考文章OWASP Guide To Authentication
Dos and Don’ts of Client Authentication on the Web (PDF)
Charles Miller’s Persistent Login Cookie Best Practice
Personal knowledge questions for fallback authentication: Security questions in the era of Facebook