從“用戶登錄”看WebFuture有多專業(yè),最常見的功能并不簡單!
用戶注冊/登錄功能(含找回密碼)是所有系統(tǒng)中都會有的一個功能模塊,但這個功能絕對不簡單!甚至可以說是非常復雜!我們來看看這個功能需要考慮哪些東西就知道了:
一、基礎功能需求
● 應支持最常見的賬號密碼登錄方式(含用戶名+密碼、身份證號碼+密碼、郵箱+密碼、手機號碼+密碼,應自動識別不同的登錄方式);
● 應支持手機免密登錄(含自動注冊賬號);
● 應支持微信掃碼登錄、微信授權登錄(兩者是不同的);
● 應支持企業(yè)微信掃碼登錄、企業(yè)微信授權登錄(兩者是不同的);
● 應支持釘釘掃碼登錄、釘釘授權登錄(兩者是不同的);
● 以上所有登錄方式應都是可以配置是否啟用,以及默認登錄方式;
● 用戶注冊時的字段(電子郵件、手機號碼、身份證號碼、出生日期)可以配置是否啟用和是否必填;
● 應支持開啟/關閉用戶注冊、登錄功能;
● 登錄時應可更改保持登錄狀態(tài)的期限(關閉瀏覽器前/24小時內/7天內/1個月內/始終),應支持配置默認保持登錄狀態(tài)的期限;
二、安全性方面的要求
● 注冊/登錄/找回密碼的代碼邏輯中應沒有SQL注入攻擊漏洞、XSS漏洞、CSRF漏洞等常見安全漏洞;
● 應支持防重復提交機制。表單提交按鈕應具有防止反復提交的功能,確保數(shù)據(jù)不會被重復記錄,在提交時會禁用提交按鈕并輔以動態(tài)效果提示用戶已觸發(fā)提交事件;在服務器端則會進行重復提交的驗證和攔截,以防止因為用戶誤操作、網(wǎng)絡傳輸問題、黑客攻擊等原因而出現(xiàn)的表單重復提交。
● 強制使用強密碼,強密碼規(guī)則包含:密碼不能為空;密碼長度不能少于6位;密碼不能包含空格;密碼必須包含一個字符,這個字符既不是數(shù)字也不是字母;密碼必須包含數(shù)字;密碼必須包含小寫字母;密碼必須包含大寫字母。不允許使用常見密碼(有些強密碼也仍是常見密碼,比如:123!@#、123!QAZ、admin*888等);密碼的字符數(shù)量<用戶名的字符數(shù)量+3時,密碼不能包含用戶名;密碼不能是“用戶名”+“111、222、333、444、555、666、777、888、999、000、123、456、789、!@#、!QA、@WS、1qa、2ws”的任意組合;密碼禁止設置為用戶名+4位年份數(shù)字;密碼不能是“用戶名”+“!@#$%^&*”中的任意一個字符+4位及以內的數(shù)字。
● 密碼應優(yōu)先使用SM3國密算法進行加密后保存在數(shù)據(jù)庫中,不得保存明文密碼。密碼的密文不得是直接對密碼原文進行加密,而應該是加鹽加密,鹽值應是在安裝系統(tǒng)時自動生成的隨機字符串,以保證相同的密碼在每個網(wǎng)站中的加密結果也不一樣。
● 應提供管理員賬號安全檢查功能,對于設置為弱口令和常用密碼的賬號自動修改為強密碼并鎖定賬號。
● 應支持在提交注冊/登錄表單前對表單數(shù)據(jù)采用RSA1024等非對稱加密算法進行加密,以防用戶名、密碼等關鍵信息在傳輸過程中被竊聽,即使沒有部署SSL證書也可以做到;
● 應支持暴力猜解防護,要有相應的安全策略且可配置,比如平時不開啟驗證碼以方便用戶登錄,但3次登錄失敗后就要開啟驗證碼,10次登錄失敗后就要鎖定賬戶、50次登錄失敗后凍結終端和IP等,凍結時間可以配置;
● 應支持鎖定/解鎖用戶/管理員時,自動重置密碼為超過20個字符以上的強密碼,以防攻擊者利用SQL注入漏洞(萬一有)將這些鎖定狀態(tài)的用戶改為正常狀態(tài)后登錄這些賬戶;
● 應支持雙因子驗證,雙因子驗證是指使用賬戶+密碼登錄時,還需要驗證郵件/手機短信驗證碼或UKey驗證(可配置),同時驗證通過后才能登錄;
● 應支持管理員在非常見地登錄時二次驗證;
● 應支持管理員使用非常見設備登錄時二次驗證;
● 應支持對利用“找回密碼”功能進行暴力猜解的防護;
● 應支持對惡意消耗手機短信數(shù)量的防護;
● 應支持定時自動重置長時間未登錄用戶的密碼;
● 應支持定時自動鎖定長時間未登錄的管理員;
● 應支持強制管理員定期修改密碼;
● 應支持攻擊者利用社會工程學原理來攻擊,禁止注冊黑名單中的用戶名和昵稱;
● 應支持手機號碼和郵箱真實性驗證;
● 應支持密碼、余額等用戶關鍵信息完整性的驗證,即要使用專門的字段來將用戶相關信息進行加鹽加密后保存在某個字段中,登錄等操作時進行驗證,以防止攻擊者惡意篡改相關數(shù)據(jù);
● 應對客戶端是否支持Cookie進行驗證,如果不支持則不允許登錄,以防惡意繞過基于Session的一些安全驗證手段;
● 應支持三員分立。三員分立是指系統(tǒng)管理員、審計管理員、安全管理員分別擁有不同的權限。系統(tǒng)管理員主要負責系統(tǒng)的資源和運行進行配置、控制和管理,包括用戶身份、系統(tǒng)資源配置、系統(tǒng)加載和啟動、系統(tǒng)運行的異常處理、數(shù)據(jù)和設備的備份與恢復等。審計管理員主要負責對審計記錄進行分析,并根據(jù)分析結果進行處理,包括根據(jù)安全審計策略對審計記錄進行存儲、管理和查詢等。安全管理員主要對系統(tǒng)中的安全策略進行配置,包括安全參數(shù)的設置,主體、客體進行統(tǒng)一安全標記,對主體進行授權,配置可信驗證策略等。
● 系統(tǒng)應默認屏蔽在錯誤響應中泄露敏感信息,包括:系統(tǒng)的詳細信息、會話標識符或者賬號信息。默認情況下當頁面出現(xiàn)異常時IIS和ASP.NET會呈現(xiàn)出錯誤頁,錯誤頁會呈現(xiàn)一些服務器環(huán)境的信息以及調試信息(如果開啟了詳細錯誤模式),產品中提供前后臺錯誤頁配置,可以通過自定義錯誤頁達到屏蔽詳細信息、美化頁面效果以及提供更多功能的目的。
● 應在系統(tǒng)日志記錄所有重要的日志事件數(shù)據(jù),系統(tǒng)確保日志記錄中包含的不可信數(shù)據(jù),不會在查看界面以代碼的形式被執(zhí)行。應限制只有授權的管理員才能訪問日志。不在日志中保存敏感信息,包括:不必要的系統(tǒng)詳細信息、會話標識符或密碼。
● 應記錄所有失敗的輸入驗證。應記錄所有的身份驗證嘗試,特別是失敗的驗證。應記錄所有失敗的訪問控制。
● 當頁面出現(xiàn)服務器內部錯誤時,可以通過開啟記錄功能,將異常信息記錄到日志文件中,可以配置同一類內部錯誤記錄時間間隔,日志會以文件的形式保存在網(wǎng)站的受保護的目錄下以防下載。
● 支持“敏感信息黑匣子”功能,利用web.config中配置的自定義錯誤頁和全局的異常處理,屏蔽異常出現(xiàn)時暴露的敏感信息。捕獲系統(tǒng)的所有出現(xiàn)異常的地方,做到友好的錯誤提示信息,不要暴露敏感信息。對于用戶登錄的地方,在驗證時盡量模糊提示。如:當?shù)卿洺鲥e時都一致提示(用戶名或密碼不正確!)能有效增加密碼暴破的難度。采用動態(tài)表單,就增加了ARP嗅探軟件捕獲密碼的難度,因此重要登錄信息采用隨機表單形式,大大保護了數(shù)據(jù)包被截取的難度。
三、用戶體驗優(yōu)化方面的要求
● 用戶名的校驗規(guī)則與即時反饋(包含長度限制、格式限制等);
● 密碼的校驗規(guī)則與即時反饋(包含長度限制、格式限制、是否符合強密碼規(guī)則);
● 用戶名/密碼為空時的提示語;
● 密碼輸入框可以顯示原始密碼,以讓用戶可以檢查是否輸入正確;
● 各種異常情況的預處理;
● 界面設計與優(yōu)化,包含多種登錄方式的切換、雙因子驗證、二次驗證的流程設計與優(yōu)化;
● 一開始并不要求輸入驗證碼,而是在登錄失敗次數(shù)達到3次(可配置)時才要求輸入,以方便用戶平時快速登錄,同時兼顧安全性要求。
● 瀏覽器兼容性,要考慮從Chrome/Edge的最新版本到各種老的瀏覽器(比如IE9)都要兼容。
● 各種常見分辨率(1024/1280/1366/1440/1600/1920/2560)的適配與優(yōu)化,頁面應采用響應式設計;
● 手機適配與優(yōu)化,應支持在各種手機瀏覽器和微信、企業(yè)微信、釘釘中訪問登錄頁時能正常使用,頁面效果和用戶體驗專為手機訪問而優(yōu)化;
● 微信/企業(yè)微信/釘釘授權登錄的用戶體驗優(yōu)化,應支持在微信/企業(yè)微信/釘釘內打開登錄頁時,可以直接授權登錄,不需要再掃碼登錄。
● 應支持無障礙訪問,支持驗證碼放大功能,支持語音驗證碼;
● 應支持適老化,老年人訪問時可以有專門的長者模式;
● 手機訪問時也應支持無障礙和適老化;
四、開放性方面的要求
● 應使用OAuth 2.0開放標準來進行用戶的授權登錄,以易于同其他采用相關標準的系統(tǒng)進行整合。
● 應支持接入第三方統(tǒng)一身份認證平臺(單點登錄);
● 應支持微信掃碼登錄、微信授權登錄、企業(yè)微信掃碼登錄、企業(yè)微信授權登錄、釘釘掃碼登錄、釘釘授權登錄等第三方平臺的登錄;
● 應支持多種登錄方式后產生的不同賬戶進行合并;
● 應提供標準、規(guī)范的用戶 API 接口,以實現(xiàn)廣泛的第三方系統(tǒng)集成;
● 為支持手機短信免密登錄、微信掃碼登錄等需求,需要接入各種第三方平臺(比如手機短信發(fā)送平臺、微信開放平臺、釘釘開放平臺)的API接口;
五、信創(chuàng)適配方面的要求
● 應可以運行在中標麒麟/銀河麒麟/統(tǒng)信等國產操作系統(tǒng)以及Windows Server、Linux等主流的服務器操作系統(tǒng)上。這個主要是和開發(fā)平臺有關。
● 應支持達夢/翰高/人大金倉等國產數(shù)據(jù)庫軟件以及SQL Server、Oracle、MySQL、PostgreSQL 等主流數(shù)據(jù)庫軟件,因為每種數(shù)據(jù)庫支持的SQL語法都有差異,所以寫代碼時要注意各種數(shù)據(jù)庫操作(建表、添加/修改/刪除字段、查詢/添加/修改/刪除記錄等)要針對每種數(shù)據(jù)庫的差異進行適配和優(yōu)化。
● 應支持金蝶ADMQ等國產消息隊列中間件和RabbitMQ,應支持金蝶AMDC、東方通TongRDS、寶蘭德CacheServer等國產分布式緩存中間件和Redis,應支持金蝶ALB、東方通TongHttpServer、寶蘭德WebServer等國產應用服務器中間件和Nginx。
● 應支持國密算法,數(shù)據(jù)加密應優(yōu)先使用國密算法。
六、擴展性方面的要求
● 軟件的可擴展性主要是指系統(tǒng)設計不僅基于當前的應用需求,而且還要考慮未來的發(fā)展需求。比如分層架構、模塊化的設計、開放的接口、插件機制、支持不同數(shù)據(jù)庫等都是一些可擴展性的具體表現(xiàn)。應基于插件機制來實現(xiàn)接入各種第三方統(tǒng)一身份認證平臺,即系統(tǒng)要實現(xiàn)插件機制,然后每個第三方統(tǒng)一身份認證平臺的接入做成一個插件,以避免項目定制化開發(fā)帶來的無法跟隨產品升級的最大弊端。
● 用戶信息應支持擴展字段機制??梢允褂脭U展字段來要求用戶注冊時填寫更多信息。擴展字段的類型應支持盡可能多的數(shù)據(jù)類型。比如:布爾型(復選框、按鈕組、下拉列表框、單選框、開關)、日期時間(日期、日期時間、生日)、整數(shù)型(整數(shù)輸入框、單選框、下拉列表、單選列表框、雙向列表框)、浮點型(浮點型輸入框、金額輸入框)、短文本(標準單行文本輸入框、復選框、下拉列表框、列表框、雙向列表框、組合輸入框)、長文本(標準多行文本輸入框(不支持 HTML)、HTML 編輯器)、文件上傳(單圖片上傳、多圖片上傳、單視頻上傳、多視頻上傳、單音頻上傳、多音頻上傳、單文件上傳、多文件上傳)、常用信息(姓名、身份證、電子郵件、手機號碼、電話號碼、QQ 號碼、郵政編碼、網(wǎng)頁地址、行政區(qū)劃)、生活場景(IP 地址、車牌號碼、地理位置、顏色、航班、火車車次)、特殊字段(聯(lián)動字段)等。
七、可伸縮性方面的要求
軟件的可伸縮性是指軟件系統(tǒng)可以在不同規(guī)模、不同檔次的運行環(huán)境平臺上運行的能力。也就是說,系統(tǒng)應支持從單機部署、雙機熱備、WEB與數(shù)據(jù)庫分離部署、前后臺分離部署、多臺服務器負載均衡部署、讀寫分離部署等各種部署方案。當采用前后臺分離部署及多服務器負載均衡部署方案時,用戶登錄模塊就要在代碼層面考慮使用分布式緩存等來保證各服務器間保持用戶登錄狀態(tài)的一致性等問題。
八、可靠性方面的要求
軟件的可靠性(健壯性/穩(wěn)定性)主要是指軟件的相應功能應能在復雜的運行環(huán)境里穩(wěn)定、可靠地運行,在出現(xiàn)異常的情況下,系統(tǒng)應具備相應的容錯機制等。換句話說,其實就是要求軟件的BUG要盡可能的少,各種未知情況都有考慮,對各種異常情況都有容錯機制。用戶登錄這個模塊對可靠性方面有著極高的要求,因為用戶登錄模塊也通常是最容易受到攻擊的模塊,攻擊者會用各種意想不到的方法和手段來進行掃描、探測和攻擊。
總結
如果從零開始研發(fā)用戶登錄功能模塊并實現(xiàn)上述所有需求,沒有幾個月時間是不可能做到的。功能研發(fā)出來以后,還要再花幾個月時間來不斷修復BUG,完善細節(jié)。如果這不是產品化的研發(fā),而是項目定制方式的研發(fā),客戶需要支付的研發(fā)成本將高得不可想象。即使基于市面上的一些開源框架來開發(fā),也需要大量的二次開發(fā)工作,因為這些開源框架在用戶登錄方面也沒有動易WebFuture考慮周全。
而且這還只是用戶登錄,還沒有考慮用戶注冊、找回密碼等相關功能,沒有考慮用戶中心的賬戶管理相關功能(修改信息、修改密碼、綁定/修改郵箱/手機/微信/企業(yè)微信/釘釘、賬號合并等),沒有考慮后臺的用戶管理相關功能(查看、修改、鎖定/解鎖、重置密碼、刪除、分配用戶組、用戶組管理、權限控制、各種參數(shù)配置等)。整個完整的用戶模塊至少需要一人年來開發(fā)。
就這還沒有考慮用戶登錄以后的任何業(yè)務需求,比如收藏、點贊、評論、投票、寫信、投稿……
用戶登錄
還沒有賬號?
立即注冊