目录
目录X

从“用户登录”看WebFuture有多专业,最常见的功能并不简单!

用户注册/登录功能(含找回密码)是所有系统中都会有的一个功能模块,但这个功能绝对不简单!甚至可以说是非常复杂!我们来看看这个功能需要考虑哪些东西就知道了:

一、基础功能需求

● 应支持最常见的账号密码登录方式(含用户名+密码、身份证号码+密码、邮箱+密码、手机号码+密码,应自动识别不同的登录方式);

● 应支持手机免密登录(含自动注册账号);

● 应支持微信扫码登录、微信授权登录(两者是不同的);

● 应支持企业微信扫码登录、企业微信授权登录(两者是不同的);

● 应支持钉钉扫码登录、钉钉授权登录(两者是不同的);

● 以上所有登录方式应都是可以配置是否启用,以及默认登录方式;

● 用户注册时的字段(电子邮件、手机号码、身份证号码、出生日期)可以配置是否启用和是否必填;

● 应支持开启/关闭用户注册登录功能;

● 登录时应可更改保持登录状态的期限(关闭浏览器前/24小时内/7天内/1个月内/始终),应支持配置默认保持登录状态的期限;

二、安全性方面的要求

● 注册/登录/找回密码的代码逻辑中应没有SQL注入攻击漏洞、XSS漏洞、CSRF漏洞等常见安全漏洞;

● 应支持防重复提交机制。表单提交按钮应具有防止反复提交的功能,确保数据不会被重复记录,在提交时会禁用提交按钮并辅以动态效果提示用户已触发提交事件;在服务器端则会进行重复提交的验证和拦截,以防止因为用户误操作、网络传输问题、黑客攻击等原因而出现的表单重复提交。

● 强制使用强密码,强密码规则包含:密码不能为空;密码长度不能少于6位;密码不能包含空格;密码必须包含一个字符,这个字符既不是数字也不是字母;密码必须包含数字;密码必须包含小写字母;密码必须包含大写字母。不允许使用常见密码(有些强密码也仍是常见密码,比如:123!@#、123!QAZ、admin*888等);密码的字符数量<用户名的字符数量+3时,密码不能包含用户名;密码不能是“用户名”+“111、222、333、444、555、666、777、888、999、000、123、456、789、!@#、!QA、@WS、1qa、2ws”的任意组合;密码禁止设置为用户名+4位年份数字;密码不能是“用户名”+“!@#$%^&*”中的任意一个字符+4位及以内的数字。

● 密码应优先使用SM3国密算法进行加密后保存在数据库中,不得保存明文密码。密码的密文不得是直接对密码原文进行加密,而应该是加盐加密,盐值应是在安装系统时自动生成的随机字符串,以保证相同的密码在每个网站中的加密结果也不一样。

● 应提供管理员账号安全检查功能,对于设置为弱口令和常用密码的账号自动修改为强密码并锁定账号。

● 应支持在提交注册/登录表单前对表单数据采用RSA1024等非对称加密算法进行加密,以防用户名、密码等关键信息在传输过程中被窃听,即使没有部署SSL证书也可以做到;

● 应支持暴力猜解防护,要有相应的安全策略且可配置,比如平时不开启验证码以方便用户登录,但3次登录失败后就要开启验证码,10次登录失败后就要锁定账户、50次登录失败后冻结终端和IP等,冻结时间可以配置;

● 应支持锁定/解锁用户/管理员时,自动重置密码为超过20个字符以上的强密码,以防攻击者利用SQL注入漏洞(万一有)将这些锁定状态的用户改为正常状态后登录这些账户;

● 应支持双因子验证,双因子验证是指使用账户+密码登录时,还需要验证邮件/手机短信验证码或UKey验证(可配置),同时验证通过后才能登录;

● 应支持管理员在非常见地登录时二次验证;

● 应支持管理员使用非常见设备登录时二次验证;

● 应支持对利用“找回密码”功能进行暴力猜解的防护;

● 应支持对恶意消耗手机短信数量的防护;

● 应支持定时自动重置长时间未登录用户的密码;

● 应支持定时自动锁定长时间未登录的管理员;

● 应支持强制管理员定期修改密码;

● 应支持攻击者利用社会工程学原理来攻击,禁止注册黑名单中的用户名和昵称;

● 应支持手机号码和邮箱真实性验证;

● 应支持密码、余额等用户关键信息完整性的验证,即要使用专门的字段来将用户相关信息进行加盐加密后保存在某个字段中,登录等操作时进行验证,以防止攻击者恶意篡改相关数据;

● 应对客户端是否支持Cookie进行验证,如果不支持则不允许登录,以防恶意绕过基于Session的一些安全验证手段;

● 应支持三员分立。三员分立是指系统管理员、审计管理员、安全管理员分别拥有不同的权限。系统管理员主要负责系统的资源和运行进行配置、控制和管理,包括用户身份、系统资源配置、系统加载和启动、系统运行的异常处理、数据和设备的备份与恢复等。审计管理员主要负责对审计记录进行分析,并根据分析结果进行处理,包括根据安全审计策略对审计记录进行存储、管理和查询等。安全管理员主要对系统中的安全策略进行配置,包括安全参数的设置,主体、客体进行统一安全标记,对主体进行授权,配置可信验证策略等。

● 系统应默认屏蔽在错误响应中泄露敏感信息,包括:系统的详细信息、会话标识符或者账号信息。默认情况下当页面出现异常时IIS和ASP.NET会呈现出错误页,错误页会呈现一些服务器环境的信息以及调试信息(如果开启了详细错误模式),产品中提供前后台错误页配置,可以通过自定义错误页达到屏蔽详细信息、美化页面效果以及提供更多功能的目的。

● 应在系统日志记录所有重要的日志事件数据,系统确保日志记录中包含的不可信数据,不会在查看界面以代码的形式被执行。应限制只有授权的管理员才能访问日志。不在日志中保存敏感信息,包括:不必要的系统详细信息、会话标识符或密码。

● 应记录所有失败的输入验证。应记录所有的身份验证尝试,特别是失败的验证。应记录所有失败的访问控制。

● 当页面出现服务器内部错误时,可以通过开启记录功能,将异常信息记录到日志文件中,可以配置同一类内部错误记录时间间隔,日志会以文件的形式保存在网站的受保护的目录下以防下载。

● 支持“敏感信息黑匣子”功能,利用web.config中配置的自定义错误页和全局的异常处理,屏蔽异常出现时暴露的敏感信息。捕获系统的所有出现异常的地方,做到友好的错误提示信息,不要暴露敏感信息。对于用户登录的地方,在验证时尽量模糊提示。如:当登录出错时都一致提示(用户名或密码不正确!)能有效增加密码暴破的难度。采用动态表单,就增加了ARP嗅探软件捕获密码的难度,因此重要登录信息采用随机表单形式,大大保护了数据包被截取的难度。

三、用户体验优化方面的要求

● 用户名的校验规则与即时反馈(包含长度限制、格式限制等);

● 密码的校验规则与即时反馈(包含长度限制、格式限制、是否符合强密码规则);

● 用户名/密码为空时的提示语;

● 密码输入框可以显示原始密码,以让用户可以检查是否输入正确;

● 各种异常情况的预处理;

● 界面设计与优化,包含多种登录方式的切换、双因子验证、二次验证的流程设计与优化;

● 一开始并不要求输入验证码,而是在登录失败次数达到3次(可配置)时才要求输入,以方便用户平时快速登录,同时兼顾安全性要求。

● 浏览器兼容性,要考虑从Chrome/Edge的最新版本到各种老的浏览器(比如IE9)都要兼容。

● 各种常见分辨率(1024/1280/1366/1440/1600/1920/2560)的适配与优化,页面应采用响应式设计;

● 手机适配与优化,应支持在各种手机浏览器和微信、企业微信、钉钉中访问登录页时能正常使用,页面效果和用户体验专为手机访问而优化

● 微信/企业微信/钉钉授权登录的用户体验优化,应支持在微信/企业微信/钉钉内打开登录页时,可以直接授权登录,不需要再扫码登录。

● 应支持无障碍访问,支持验证码放大功能,支持语音验证码;

● 应支持适老化,老年人访问时可以有专门的长者模式;

● 手机访问时也应支持无障碍和适老化;

四、开放性方面的要求

● 应使用OAuth 2.0开放标准来进行用户的授权登录,以易于同其他采用相关标准的系统进行整合。

● 应支持接入第三方统一身份认证平台(单点登录);

● 应支持微信扫码登录、微信授权登录、企业微信扫码登录、企业微信授权登录、钉钉扫码登录、钉钉授权登录等第三方平台的登录;

● 应支持多种登录方式后产生的不同账户进行合并;

● 应提供标准、规范的用户 API 接口,以实现广泛的第三方系统集成;

● 为支持手机短信免密登录、微信扫码登录等需求,需要接入各种第三方平台(比如手机短信发送平台、微信开放平台、钉钉开放平台)的API接口;

五、信创适配方面的要求

● 应可以运行在中标麒麟/银河麒麟/统信等国产操作系统以及Windows Server、Linux等主流的服务器操作系统上。这个主要是和开发平台有关。

● 应支持达梦/翰高/人大金仓等国产数据库软件以及SQL Server、Oracle、MySQL、PostgreSQL 等主流数据库软件,因为每种数据库支持的SQL语法都有差异,所以写代码时要注意各种数据库操作(建表、添加/修改/删除字段、查询/添加/修改/删除记录等)要针对每种数据库的差异进行适配和优化。

● 应支持金蝶ADMQ等国产消息队列中间件和RabbitMQ,应支持金蝶AMDC、东方通TongRDS、宝兰德CacheServer等国产分布式缓存中间件和Redis,应支持金蝶ALB、东方通TongHttpServer、宝兰德WebServer等国产应用服务器中间件和Nginx。

● 应支持国密算法,数据加密应优先使用国密算法。

六、扩展性方面的要求

● 软件的可扩展性主要是指系统设计不仅基于当前的应用需求,而且还要考虑未来的发展需求。比如分层架构、模块化的设计、开放的接口、插件机制、支持不同数据库等都是一些可扩展性的具体表现。应基于插件机制来实现接入各种第三方统一身份认证平台,即系统要实现插件机制,然后每个第三方统一身份认证平台的接入做成一个插件,以避免项目定制化开发带来的无法跟随产品升级的最大弊端。

● 用户信息应支持扩展字段机制。可以使用扩展字段来要求用户注册时填写更多信息。扩展字段的类型应支持尽可能多的数据类型。比如:布尔型(复选框、按钮组、下拉列表框、单选框、开关)、日期时间(日期、日期时间、生日)、整数型(整数输入框、单选框、下拉列表、单选列表框、双向列表框)、浮点型(浮点型输入框、金额输入框)、短文本(标准单行文本输入框、复选框、下拉列表框、列表框、双向列表框、组合输入框)、长文本(标准多行文本输入框(不支持 HTML)、HTML 编辑器)、文件上传(单图片上传、多图片上传、单视频上传、多视频上传、单音频上传、多音频上传、单文件上传、多文件上传)、常用信息(姓名、身份证、电子邮件、手机号码、电话号码、QQ 号码、邮政编码、网页地址、行政区划)、生活场景(IP 地址、车牌号码、地理位置、颜色、航班、火车车次)、特殊字段(联动字段)等。

七、可伸缩性方面的要求

软件的可伸缩性是指软件系统可以在不同规模、不同档次的运行环境平台上运行的能力。也就是说,系统应支持从单机部署、双机热备、WEB与数据库分离部署、前后台分离部署、多台服务器负载均衡部署、读写分离部署等各种部署方案。当采用前后台分离部署及多服务器负载均衡部署方案时,用户登录模块就要在代码层面考虑使用分布式缓存等来保证各服务器间保持用户登录状态的一致性等问题。

八、可靠性方面的要求

软件的可靠性(健壮性/稳定性)主要是指软件的相应功能应能在复杂的运行环境里稳定、可靠地运行,在出现异常的情况下,系统应具备相应的容错机制等。换句话说,其实就是要求软件的BUG要尽可能的少,各种未知情况都有考虑,对各种异常情况都有容错机制。用户登录这个模块对可靠性方面有着极高的要求,因为用户登录模块也通常是最容易受到攻击的模块,攻击者会用各种意想不到的方法和手段来进行扫描、探测和攻击。

总结

如果从零开始研发用户登录功能模块并实现上述所有需求,没有几个月时间是不可能做到的。功能研发出来以后,还要再花几个月时间来不断修复BUG,完善细节。如果这不是产品化的研发,而是项目定制方式的研发,客户需要支付的研发成本将高得不可想象。即使基于市面上的一些开源框架来开发,也需要大量的二次开发工作,因为这些开源框架在用户登录方面也没有动易WebFuture考虑周全。

而且这还只是用户登录,还没有考虑用户注册、找回密码等相关功能,没有考虑用户中心的账户管理相关功能(修改信息、修改密码、绑定/修改邮箱/手机/微信/企业微信/钉钉、账号合并等),没有考虑后台的用户管理相关功能(查看、修改、锁定/解锁、重置密码、删除、分配用户组、用户组管理、权限控制、各种参数配置等)。整个完整的用户模块至少需要一人年来开发。

就这还没有考虑用户登录以后的任何业务需求,比如收藏、点赞、评论、投票、写信、投稿……

【打印正文】 发布时间:2025-05-08 11:01:31 浏览次数: 作者: 来源:本站原创
×

用户登录