用户登录功能是Web应用系统具备的最基本的功能,关系到用户数据和应用系统数据的安全,设计一个安全的用户登录功能,涉及到以下几个方面的内容。
(一) 老生常谈——口令
1. 口令长度与复杂度限制
限制用户输入一些非常容易被破解的口令,比如qwert、asdfg、123456、password之类的,参考twitter和 facebook的设计,为这样的口令做一个黑名单,不允许使用黑名单中的口令。同时,还对用户口令的长度、复杂度进行检查,要求用户设置足够长度,且复 杂度符合安全策略的口令。
在口令安全的这个方面,用户体验和安全可能是相对的。限制用户输入某些口令及口令的长度和复杂度,在用户体验方面可能并不太好。所以,很多成功且 设计良好的社交网站(SNS)都提供了UX让用户知道他的口令强度是什么样的,这样可以让用户有一个选择,目的就是告诉用户——要想安全,先把口令设得好 一点。
2. 不要明文保存用户的口令
用户都会用相同的ID相同的口令来登录很多网站。所以,如果Web应用系统明文保存口令的话,那么,数据被不良员工流传出去那对用户将是灾难性的。所以,用户的口令一定要加密保存,最好是用不可逆的加密,但不要直接使用诸如MD5或是SHA1之类加密算法。
3. 不要让浏览器保存口令
浏览器记住口令,对用户来说是很方便的事,因为用户不可能记住那么多的口令,只能借助于某些工具帮助记忆,浏览器只是其中的一种。但对于用户数据的安全来说,有很多方法可以获取浏览器记住的口令。所以,不要让浏览器保存用户名和口令。
(二) 用户登录状态
HTTP是无状态的协议,是无法记录用户访问状态的。用户的每次请求都是独立的无关联的,一笔是一笔。而我们的Web应用系统都是设计成多个页面 的,在页面跳转过程中我们需要知道用户的状态,尤其是用户登录的状态,这样我们在页面跳转后我们才知道是否可以让用户有权限来操作一些功能或是查看一些数 据。
我们每个页面都需要对用户的身份进行认证。当然,我们不可能让用户在每个页面上输入用户名和口令。为了实现这一功能,Web应用系统会把用户登录 的信息存放在客户端的Cookie里,每个页面都从这个Cookie里获得用户是否登录的信息,从而达到记录状态,验证用户的目的。但是,Cookie的 使用并不是简单的事,下面是使用Cookie的一些原则。
1. 千万不要在Cookie中存放用户的密码
千万不要在Cookie中存放用户的密码,加密的密码都不行。因为这个密码可以被人获取并尝试离线穷举。所以,一定不能把用户的密码保存在Cookie中。
2. 正确的设计“记住密码”
这个功能简直就是一个安全隐患,通常的设计是用户户勾选了这个功能,系统会生成一个Cookie。Cookie包括用户名和一个固定的散列值,这个固定的散列值一直使用。这样,可以在所有的设备和客户上都可以登录,而且可以有多个用户同时登录。更安全一点的做法是:
1) 在Cookie中,保存三个东西——用户名,登录序列,登录Token
 用户名:明文存放。
 登录序列:一个被MD5散列过的随机数,仅当强制用户输入口令时更新(如:用户修改了口令)。
 登录Token:一个被MD5散列过的随机数,仅一个登录Session内有效,新的登录Session会更新它。
2) 上述三个要素会存在服务器上,服务器需要验证客户端Cookie里的这三个要素。
登录Token是单实例登录,意思就是一个用户只能有一个登录实例。登录序列是用来做盗用行为检测的。
如果用户的Cookie被盗后,盗用者使用这个Cookie访问网站时,我们的系统是以为是合法用户,然后更新“登录Token”。而真正的用户 回来访问时,系统发现只有“用户名”和“登录序列”相同,但是“登录Token” 不对,这样的话,系统就知道,这个用户可能出现了被盗用的情况。于是,系统可以清除并更改登录序列 和 登录Token,这样就可以令所有的Cookie失效,并要求用户输入口令。并给警告用户系统安全。
3. 不要让Cookie有权限访问所有的操作
参考新浪微博的XSS攻击,即使Cookie有权限访问登录之后的所有操作。下面的这些功能一定要用户输入口令:
 修改口令。
 修改电子邮件。
 用户的隐私信息。
 涉及金钱的用户消费功能。
(三) 找回口令功能
找回口令的功能一定要提供,目前常用的找回口令功能大致有以下几种:
1) 安全问答。
事实证明,这个环节很烦人,而且用户并不能很好的设置安全问答。什么,我的生日啊,我母亲的生日,等等。因为今天的互联网和以前不一样了,因为SNS,今天的互联比以前更真实了,在facebook,开心,人人网,LinkedIn查到很多的真实的信息。
2) 重置用户的密码。
这有可能让用户的密码遭到恶意攻击
3) 安全一点的做法——通过邮件自行重置。
当用户申请找回口令功能的时候,系统生成一个MD5唯一的随机字串(可通过UID+IP+timestamp+随机数),放在数据库中,然后设置 上时限(比如1小时内),给用户发一个邮件,这个连接中包含那个MD5的字串的链接,用户通过点击那个链接来自己重新设置新的口令。
4) 更安全一点的做法——多重认证。
比如:通过手机+邮件的方式让用户输入验证码,还可以使用数字证书、动态口令等方式。是否使用多重认证,主要取决于Web应用系统的重要性程度。
(四) 防御暴力破解
1) 使用验证码。
验证码是后台随机产生的一个短暂的验证码,这个验证码一般是一个计算机很难识别的图片。这样就可以防止以程序的方式来尝试用户的口令。
事实证明,这是最简单也最有效的方式。当然,总是让用户输入那些肉眼都看不清的验证码的用户体验不好,所以,可以折中一下。比如Google,当发现一个IP地址发出大量的搜索后,其会要求你输入验证码。
2) 用户口令失败次数
设置口令失败的上限,如果失败过多,则把帐号锁了,需要用户以找回口令的方式来重新激活帐号。
但是,这个功能可能会被恶意人使用,造成用户账户不能使用(这是一种变相的拒绝服务攻击)。更好的方法是,结合IP地址做验证,同时增加尝试破解 的时间成本。如,两次口令尝试的间隔是5秒钟。三次以上错误,帐号被临时锁上30秒,5次以上帐号被锁1分钟,10次以上错误帐号被锁4小时等等。如果发 现来自同一IP地址的错误次数太多,正确的做法是禁止这个用户在这个IP地址登录,而不是单纯的禁止用户登录。

注:转载于http://qq405371160.iteye.com/blog/1743237

转载于:https://www.cnblogs.com/wcyBlog/p/3820353.html

如何设计安全的用户登录功能相关推荐

  1. 【软件测试】:“用户登录”功能测试用例设计方法

    谈谈登录测试 可能你会说,"用户登录"这个测试对象也有点太简单了吧,我只要找一个用户,让他在界面上输入用户名和密码,然后点击"确 认"按钮,验证一下是否登录成功 ...

  2. PHP用户登录功能实现

    PHP用户登录功能实现 设计数据库连接,简单查询,表单提交,直接上代码,大家很容易明白. 我建了一个很简单的数据库,表单包括用户名,ID,密码. 用户登录界面 <html><head ...

  3. ssm当用户登录成功显示用户名_从零到企业级SSM电商项目实战教程(十八)用户登录功能开发...

    用户模块功能介绍 1.登录 2.用户名验证 3.注册 4.忘记密码 5.提交问题答案 6.重置密码 7.获取用户信息 8.更新用户信息 9.退出登录 学习目标 1.理解横向越权.纵向越权安全漏洞 2. ...

  4. [转]你会做Web上的用户登录功能吗?

    Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能.下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关 ...

  5. 实现Web上的用户登录功能

    https://coolshell.cn/articles/5353.html Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做 ...

  6. Web上的用户登录功能安全

    转载自:http://www.daimami.com/web/217218.htm 你会做Web上的用户登录功能吗? Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后, ...

  7. web上的用户登录功能

    Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能.下面 的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个 ...

  8. 你会做Web上的用户登录功能吗?

    你会做Web上的用户登录功能吗? 2011年8月25日 陈皓    Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能 ...

  9. Web上的用户登录功能——酷壳_陈皓

    为什么80%的码农都做不了架构师?>>>    Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能. ...

最新文章

  1. Python基础10-函数基础
  2. Maven项目pom.xml报错
  3. LeetCode Roman to Integer(罗马数字转换)
  4. 开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
  5. 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)
  6. 对称加密与非对称加密的区别_https原理及对称加密、非对称加密、数字证书、数字签名的含义...
  7. php linux 缓存文件,Linux下搭建网站提示缓存文件写入失败怎么办?
  8. linux用户没有创建文件的权限设置密码,Linux学习第五章用户身份与文件权限
  9. php app用户验证失败,无法验证app需要互联网连接以认证 建议更换登陆的AppleID
  10. 易飞计件工资的设计及应用
  11. 深度学习常用显卡比较
  12. 微生活完成3200万元A轮融资,助企业快速搭建移动互联CRM
  13. The end tag is unbalanced异常
  14. 验证手机号码格式的正则表达式编写思路详解
  15. 分享Silverlight/WPF/Windows Phone一周学习导读(06月06日-06月11日)
  16. python中的if判断,和while循环的用法
  17. 基于云效Flow配置 Jenkins 源
  18. 2030年的人工智能与生活(AI and Life in 2030)
  19. QT Qml 窗口背景透明
  20. ubuntu上的疑难杂症(不定期更新……)

热门文章

  1. 三种地理参考信息模型:WMS,WFS,WCS(转)
  2. webpack来打包你的vue项目,如发现你的vendor.js过大
  3. 训练一个神经网络 能让她认得我
  4. oracle数据量大时候分区索引思路
  5. 阿里云天池 金融风控训练营Task1 广东工业站
  6. 关于双黑洞和引力波,LIGO科学家回答了这7个你可能会关心的问题
  7. 那些年收藏的技术文章(一) CSDN篇
  8. 【原】Jenkins持续集成环境搭建之创建java项目的job【centos6.5 java maven git 项目】...
  9. 修改JAVA代码,需要重启Tomcat的原因
  10. Power BI:M与DAX以及度量与计算列