登录是系统中最重要的一个功能之一,登录成功就能拥有系统的相关使用权限,所以设计一个安全的登录流程是十分必要的,那在一般登录中需要考虑哪些重要因素呢?请看本文讲述。
使用https协议进行传输,虽然麻烦,但是很强的保护措施,还没使用https的站点赶紧转成https吧。
强制用户使用有一定强度且复杂的密码,必须要有大小写加数字,长度在8位以上,杜绝像123456之类的弱密码。
密码不要明文保存到数据库,CSDN当年使用明文存储密码导致用户密码被完全暴露,这个事件影响十分严重。所以造成不要使用明文存储密码,要使用像MD5之类的散列算法加密存储,加密之前密码同时还要加上一个不固定的salt值一起拼接加密,一般md5(md5(password) + salt)就可以了,这个salt是盐,一起加密增加密码的长度也增加了破解的难度,盐一般设计为64位随机生成的字符串,最好分开存放,假如用户信息库被攻击了黑客也拿不到盐的库。不能使用可逆的算法,如果可逆,那如何保存密钥是个非常棘手的问题,一般使用明文加密与数据库中的密文对比就能确定密码正确与否,我们不需要知道用户的明文是什么,如果用户忘了可以通过重置或者密码保护问题修改密码,这也比总明文存储要好一万倍。
MD5现在已经不是十分安全了,最好使sha256,sha512之类安全强度更高的散列加密算法。
用户名密码错误不要单方面提示,如果密码错误提示用户说密码错误这样攻击者就知道用户名是对的,下次攻击密码,所以不管是用户名还是密码错误都给出同样的提示:用户名或密码错误,或者别的不具体的提示的错误都可以。关于PHP中如何设计安全的密码,请看本站文章:《PHP安全之密码哈希处理》。
前端禁止用户输入导致sql注入的字符,后台也要做sql注入的防护,请参考本站文章:《PHP安全之使用PDO防SQL注入》。
保存历史密码,一段时间没登录的用户再次登录时提示要修改密码才能登录,这时新密码不能和历史密码一样,苹果就是这么做的。
保存每次的登录信息日志,如果登录的IP与以往有很大差别(必要时可使用异地登录告警),要引导用户重置密码方可登录。
不要在cookie中保留用户密码,如果一定要使用cookie实现自动登录,切记不要使用简单的用户名+密码MD5保存到cookie,要把用户ID、用户名、过期时间、IP、不固定的salt等一起考虑进去,这个当然要可逆,服务端要进行解密才能验证用户自动登录有效。另外,cookie要设置为http only,这样就不能通过脚本访问cookie,保证cookie的安全性。
不要让浏览器记住密码,虽然记住密码很方便,但也不安全,所以前端最好做控制。
一段时间类的尝试登录失败次数达到某个值,要锁定用户登录,如失败5次锁定24小时。或者间隔性锁定,如失败3次后锁定半小时,再失败1次锁定1小时,再失败1次锁定24小时。
设置会话有效期,比如登录后10分钟不操作就失效,要重新登录。
验证码使用,加上干扰线,防止计算机能够轻易识别,这样也可以防止黑客以程序的方式来尝试登录。关于验证码的使用可以参考本站文章《漂亮的PHP验证码》。
手机登录的一般使用短信验证码的,控制验证码的时效性,即验证码一次有效,一分钟内只能发送一次。
有必要的要采用单点登陆,如果允许用户多处登录的要给用户安全提醒。
重置密码最好通过邮箱发送一定时间内生效的重置链接,或者手机短信验证码,或者两者相结合的方法,可参考本站文章:《PHP+Mysql+jQuery找回密码》。像一般的大公司都有设计一个动态密码的东西,手机即一切,所以也要妥善保管自己的动态加密的APP,最好加上指纹或手势。
设置用户可以登录的IP,即IP白名单。像比如财务系统,限制财务人员只能在办公室登录系统。
可以考虑使用第三方授权登录接口,如qq登录,微信登录,微博登录,github登录等等,优化用户登录体验。
先总结到这,没有真正安全的登录机制,正所谓道高一尺魔高一丈,我们要做到与时俱进。