`
kong0itey
  • 浏览: 302377 次
社区版块
存档分类
最新评论

你会做Web上的用户登录功能吗?(转)

    博客分类:
  • java
 
阅读更多

Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能。下面 的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关系到用户安全的功能,希望大家能从下面的文章中能知道什么样的方法才是一个好的用户登录 功能。以下内容,转载时请保持原文一致,并请注明作者和出处

用户名和口令

首先,我们先来说说用户名和口令的事。这并不是本站第一次谈论这个事了。如何管理自己的口令 让你知道怎么管理自己的口令,破解你的口令 让你知道在现代这样速度的计算速度下,用穷举法破解你的口令可能会是一件很轻松的事。在这里我想告诉从开发者的角度上来做设计这个用户名和口令的事。下面一几件规则:

  • 限制用户输入一些非常容易被破解的口令 。如什么qwert,123456, password之类,就像twitter限制用户的口令 一样做一个口令的黑名单。另外,你可以限制用户口令的长度,是否有大小写,是否有数字,你可以用你的程序做一下校验。当然,这可能会让用户感到很不爽,所以,现在很多网站都提供了UX让用户知道他的口令强度是什么样的(比如这个有趣的UX ),这样可以让用户有一个选择,目的就是告诉用户——要想安全,先把口令设得好一点。
  • 千万不要明文保存用户的口令 。正如如何管理自己的口令 所 说的一样,很多时候,用户都会用相同的ID相同的口令来登录很多网站。所以,如果你的网站明文保存的话,那么,如果你的数据被你的不良员工流传出去那对用 户是灾难性的。所以,用户的口令一定要加密保存,最好是用不可逆的加密,如MD5或是SHA1之类的有hash算法的不可逆的加密算法。CSDN曾明文保 存过用户的口令。(另,对于国内公司的品行以及有关部门的管理方式,我不敢保证国内网站以加密的方式保存你的口令。我觉得,做为一个有良知的人,我们应该 加密保存用户的口令)
  • 是否让浏览器保存口令 。 我们有N多的方法可以不让浏览器保存用户名和口令。但是这可能对用户来说很不爽。因为在真实世界里谁也记得不住那么多的口令。很多用户可能会使用一些密码 管理工具来保存密码,浏览器只是其中一种。是否让浏览器保存这个需要你做决定,重点是看一下你的系统的安全级别是否要求比较高,如果是的话,则不要让浏览 器保存密码,并在网站明显的位置告诉用户——保存口令最安全的地方只有你的大脑。
  • 口令在网上的传输 。因为HTTP是明文协议,所以,用户名和口令在网上也是明文发送的,这个很不安全。你可以看看这篇文章 你 就明白了。要做到加密传输就必需使用HTTPS协议。但是,在中国还是有很多网站的Web登录方式还在使用ActiveX控件,这可能成为IE6还大量存 在的原因。我通常理解为这些ActiveX控件是为了反键盘记录程序的。 不过,我依然觉ActiveX控件不应该存在,因为在国外的众多安全很重要的站点上都看不到ActiveX的控件的身影。

用户登录状态

首先,我想告诉大家的是,因为HTTP是无状态的协议,也就是说,这个协议是无法记录用户访问状态的,其每次请求都是独立的无关联的,一笔是一笔。 而我们的网站都是设计成多个页面的,所在页面跳转过程中我们需要知道用户的状态,尤其是用户登录的状态,这样我们在页面跳转后我们才知道是否可以让用户有 权限来操作一些功能或是查看一些数据。

所以,我们每个页面都需要对用户的身份进行认证 。当然,我们不可能让用户在每个页面上输入用户名和口令,这会让 用户觉得我们的网站相当的SB。为了实现这一功能,用得最多的技术就是浏览器的cookie,我们会把用户登录的信息存放在客户端的cookie里,这 样,我们每个页面都从这个cookie里获得用户是否登录的信息,从而达到记录状态,验证用户的目的。但是,你真的会用cookie吗?下面是使用 cookie的一些原则。

  • 千万不要在cookie中存放用户的密码 。加密的密码都不行。因为这个密码可以被人获取并尝试离线穷举。所以,你一定不能把用户的密码保存在cookie中。我看到太多的站点这么干了。
  • 正确设计“记住密码” 。这个功能简直就是一个安全隐患,我觉得并不是所有的程序员都知道怎么设计这个事。一般 的设计 是——一时用户勾选了这个功能,系统会生成一个cookie,cookie包括用户名和一个固定的散列值,这个固定的散列值一直使用。这样,你就可以在所 有的设备和客户上都可以登录,而且可以有多个用户同时登录。这个并不是很安全。下面是一些更为安全的方法供你参考:
    (——更新 2011/08/26,原文中有些小错误,并且说的不清楚,重新调整了一下——

1)在cookie中,保存三个东西——用户名登录序列登录token

用户名 :明文存放。
登录序列 :一个被MD5散列过的随机数,仅当强制用户输入口令时更新(如:用户修改了口令)
登录token :一个被MD5散列过的随机数,仅一个登录session内有效,新的登录session会更新它

2)上述三个东西会存在服务器上,服务器的验证用户需要验证客户端cookie里的这三个事。

3)这样的设计会有什么样的效果,会有下面的效果,

a)登录token 是单实例登录。意思就是一个用户只能有一个登录实例。

b)登录序列 是用来做盗用行为检测的。如果用户的cookie被盗后,盗用者使用这个cookie访问网站时,我们的系统是以为是合法用户,然后更新“登录token ”,而真正的用户回来访问时,系统发现只有“用户名 ”和“登录序列 ”相同,但是“登录token ” 不对,这样的话,系统就知道,这个用户可能出现了被盗用的情况,于是,系统可以清除并更改登录序列  登录token ,这样就可以令所有的cookie失效,并要求用户输入口令。并给警告用户系统安全。

4)当然,上述这样的设计还是会有一些问题,比如:同一用户的不同设备登录,甚至在同一个设备上使用不同的浏览器保登录 。一个设备会让另一个设备的登录token登录序列 失效,从而让其它设备和浏览器需要重新登录,并会造成cookie被盗用的假象。所以,你在服务器服还需要考虑- IP 地址

a) 如果以口令方式登录,我们无需更新服务器的“登录序列 ”和 “登录token ”(但需要更新cookie)。因为我们认为口令只有真正的用户知道。

b) 如果 IP相同 ,那么,我们无需更新服务器的“登录序列 ”和 “登录token ”(但需要更新cookie)。因为我们认为是同一用户有同一IP(当然,同一个局域网里也有同一IP,但我们认为这个局域网是用户可以控制的。网吧内并不推荐使用这一功能)。

c) 如果 (IP不同 && 没有用口令登录 ),那么,“登录token ” 就会在多个IP间发生变化(登录token在两个或多个ip间被来来回回的变换),当在一定时间内达到一定次数后,系统才会真正觉得被盗用的可能性很高,此时系统在后台清除“登录序列 ”和“登录token “,让Cookie失效,强制用户输入口令(或是要求用户更改口令),以保证多台设备上的cookie一致。

  • 不要让cookie有权限访问所有的操作 。否则就是XSS攻击,这个功能请参看新浪微博的XSS攻击 。下面的这些功能一定要用户输入口令:
1)修改口令。
2)修改电子邮件。(电子邮件通常用来找回用户密码,最好通发邮件或是发手机短信的方式修改,或者干脆就不让改一一用电子邮件做帐号名)
3)用户的隐私信息。
4)用户消费功能。
  • 权衡Cookie的过期时间。 如果是永不过期,会有很不错的用户体验,但是这也会让用户很快就忘了登录密码。 如果设置上过期期限,比如2周,一个月,那么可能会好一点,但是2周和一个月后,用户依然会忘了密码。尤其是用户在一些公共电脑上,如果保存了永久 cookie的话,等于泄露了帐号。所以,对于cookie的过期时间我们还需要权衡。

找回口令的功能

找回口令的功能一定要提供。但是很多朋友并不知道怎么来设计这个功能。我们有很多找回口令的设计,下面我逐个点评一下。

  • 千万不要使用安全问答 。事实证明,这个环节很烦人,而且用户并不能很好的设置安全问答。什么,我的生日啊,我 母亲的生日,等等。因为今天的互联网和以前不一样了,因为SNS,今天的互联比以前更真实了,我可以上facebook,开心,人人网,LinkedIn 查到你的很多的真实的信息。通过这些信息我可以使用安全问答来重设你的口令。 这里需要说一下 Facebook,Facebook的安全问答很强大,还要你通过照片认人,呵呵。
  • 不要重置用户的密码 。因为这有可能让用户的密码遭到恶意攻击。当然,你要发个邮件给用户让其确认,用户点击邮 件中的一个链接,你再重置。我并不推荐这样的方法,因为用户一般都会用笔记下来这个很难记的口令,然后登录系统,因为登录系统时使用了“记住密码”的功 能,所以导致用户不会去修改密码,从而要么导到被写下来的密码被人盗取,要么又忘记了密码。
  • 好一点的做法——通过邮件自行重置 。当用户申请找回口令功能的时候,系统生成一个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 也不失为一个很不错的选择。
分享到:
评论

相关推荐

    C#做的Web用户登录注册系统

    【标题】"C#做的Web用户登录注册系统"是一个基于C#编程语言开发的Web应用程序,主要用于实现用户的身份验证和管理功能。这类系统是任何Web应用程序的基础,它确保只有合法的用户可以访问受保护的内容。 在Web开发...

    web实现注册登录功能源代码

    web实现注册登录功能源代码,完整代码教程。适合新开发人员练习使用

    好看的WEB登录界面

    在开发一个吸引人的WEB登录界面时,设计师和开发者需要考虑多方面的细节,以确保用户体验的优良和安全性。本文将深入探讨“好看的WEB登录界面”这一主题,包括设计原则、技术实现以及最佳实践。 首先,一个优秀的...

    MVC WebApi 用户权限验证及授权DEMO

    前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权限验证来实现Web系统登录,Mvc...

    django+python实现的web入门程序-注册登录功能-sqlite3数据库

    【标题】"django+python实现的web入门程序-注册登录功能-sqlite3数据库"是一个基于Python的Django框架和SQLite3数据库构建的初级Web应用程序。这个程序旨在帮助初学者理解如何在Django中实现用户注册和登录的核心...

    springboot实现web端微信扫码登录项目(基于微信开放平台)

    在本文中,我们将深入探讨如何使用SpringBoot框架来实现一个基于微信开放平台的Web端扫码登录功能。微信扫码登录是一种安全、便捷的用户身份验证方式,它允许用户通过扫描二维码来授权登录,而无需输入用户名和密码...

    PHP 连接mysql数据库做简单的登录页面,实现用户的登录注册功能

    如果匹配,我们启动一个会话并存储用户ID,以便后续页面可以识别登录状态。 这就是在PHP中连接MySQL数据库创建登录和注册页面的基本流程。确保在实际项目中添加额外的安全措施,例如输入验证、错误处理以及防止SQL...

    C# aps.net MVC web微信三方扫码登录与授权登录

    5. **授权登录**:授权登录是另一种常见的微信登录方式,用户在网站上点击“微信登录”按钮后,会被重定向到微信服务器进行身份验证。验证成功后,用户会授权给网站访问其部分信息,网站再通过回调地址接收微信...

    小程序使用ASP.NET Web Api 作服务端实现用户登录- 前端+服务端

    小程序开发 简单实现用户登录功能,服务端使用ASP.NET Web API 具体代码详细讲解见:http://www.51softs.com/aspnet/xiaochengxu-kaifa-shiyong-webapi-shixian-denglu.html

    Web开发中经常用到分享功能

    在Web开发中,分享功能是不可或缺的一部分,它允许用户将网站内容轻松地传播到其他平台,如社交媒体、电子邮件或即时通讯应用。这个简单的分享功能涉及的技术和步骤多种多样,涵盖前端交互、后端处理以及与第三方...

    spring+mybatis+mysql实现的用户登录功能

    在IT行业中,构建一个用户登录系统是常见的任务,特别是在Web应用程序开发中。在这个场景中,我们看到使用了三个核心技术:Spring、MyBatis和MySQL。接下来,我们将详细探讨这三个技术如何协同工作以实现用户登录...

    Javaweb大作业做一个简单网站,包括注册登录等功能

    在本项目中,我们主要探讨的是如何利用JavaWeb技术栈构建一个包含注册和登录功能的简单网站。...通过这个项目,你可以学习到JavaWeb开发的基础流程和常见技术,同时也能提升在实际问题解决和系统设计上的能力。

    web登录页面及后台管理页面(静态的html源码文件)

    在Web开发中,登录页面和后台管理页面是网站的核心组成部分,它们确保了用户的安全性和管理员的有效控制。这个压缩包提供的是静态HTML源码文件,意味着它们不包含服务器端的脚本,如PHP、Java或ASP.NET,而是由...

    javaweb登录功能实现,eclipse开发工具,mysql作为数据库

    在JavaWeb开发中,构建一个登录功能是基础且重要的任务,尤其对于初学者而言,它可以帮助理解Web应用程序的核心原理。本教程将引导你通过Eclipse开发环境和MySQL数据库来实现一个简单的网页登录功能。 首先,我们...

    web登录页面

    总的来说,创建一个"好看的web登录页面"需要结合美学、用户体验和功能性,通过合理的布局、色彩搭配、交互设计和前端技术来实现。在实际开发过程中,设计师和开发者需要不断迭代优化,以提供最佳的登录体验。

    java 连接数据库实现用户登录功能

    在Java编程中,连接数据库并实现用户登录功能是一项基本任务,尤其对于初学者而言,这是一个很好的实践项目。这里我们将深入探讨如何使用Java连接Oracle数据库,创建登录界面,并处理登录验证。 首先,`LoginFrame....

    海康威视web3.0开发包

    海康威视作为全球领先的安防产品及解决方案提供商,其web3.0开发包是一个专为开发者设计的工具,旨在帮助用户构建基于Web的监控系统,实现远程访问、控制和管理海康威视的设备。这个开发包是海康威视在Web技术上的...

    LoadRunner压力测试简单用户登录-绝对并发-[操作步骤图片]

    LoadRunner 压力测试简单用户登录操作步骤详解 LoadRunner 是一款功能强大且流行的性能测试工具,广泛应用于网站压力测试、负载测试、性能优化等领域。今天,我们将详细介绍 LoadRunner 中的压力测试简单用户登录...

    struts2实现用户登录注册

    Struts2是一个强大的MVC(模型-视图-控制器)框架,它在Java Web开发中被广泛应用,尤其在处理复杂的业务逻辑和用户交互时。在这个项目"struts2实现用户登录注册"中,我们将深入探讨如何利用Struts2在Eclipse开发...

    JAVA WEB 登录系统

    在本项目中,我们讨论的是一个基于JAVA WEB的登录系统,该系统采用了JSP技术来构建用户界面,并通过与SQL数据库交互来管理用户账户信息。下面将详细解析这个登录系统的各个方面。 1. **JAVA WEB基础**:JAVA WEB是...

Global site tag (gtag.js) - Google Analytics