用戶登錄是系統(tǒng)中最重要的功能之一,登錄成功就能擁有系統(tǒng)的相關(guān)使用權(quán)限。所以設(shè)計(jì)一個(gè)安全的登錄流程是十分必要的。保護(hù)用戶賬號(hào)不被黑客竊取,既是在保護(hù)用戶的基本利益,更是在保護(hù)網(wǎng)站的信譽(yù)和業(yè)務(wù)發(fā)展。
流程安全性
安全的登錄流程必須使用 HTTPS 協(xié)議。HTTPS 協(xié)議具有較高的安全性,可以保證數(shù)據(jù)傳輸過(guò)程的安全。雖然有 fiddler 等代理方式可以截取數(shù)據(jù),但一般情況下沒(méi)有用戶的配合也無(wú)法截取。HTTPS 證書可以在阿里云申請(qǐng),個(gè)人站點(diǎn)可以直接用免費(fèi)版,非常方便。nginx 和 Spring Boot 的配置也非常簡(jiǎn)單。
登錄一定要有人機(jī)驗(yàn)證機(jī)制,可以防止黑客以暴力破解的方式嘗試登錄。通常可以用圖片驗(yàn)證碼,并且圖片要加干擾線,使用不同的字體、大小寫提高識(shí)別難度。目前有打碼平臺(tái)和 AI 方式可以識(shí)別圖片驗(yàn)證碼,但是成本比較高。一些大型網(wǎng)站已經(jīng)在使用新的驗(yàn)證方式,比如拖動(dòng)鼠標(biāo)移動(dòng)滑塊或者把一個(gè)傾斜的圖片扶正,攻擊的難度還是比較高的。
一定要注意防范 XSS、CSRF 攻擊。攻擊者通過(guò)在目標(biāo)網(wǎng)站上注入惡意腳本,可以在其他用戶的瀏覽器上運(yùn)行腳本。利用這些惡意腳本,攻擊者可獲取用戶的敏感信息。用戶提交的任何數(shù)據(jù)都要保持懷疑態(tài)度,不能完全信任,該過(guò)濾就過(guò)濾,該攔截就攔截。國(guó)內(nèi)大型網(wǎng)站,比如淘寶也存在過(guò) CSRF 漏洞,可見(jiàn)大家對(duì)這種攻擊形式還比較陌生。
后臺(tái)登錄代碼要注意防范 SQL 注入攻擊。如果黑客提交 password or 1 = 1 而后臺(tái)沒(méi)做 SQL 防注入,只是查詢下數(shù)據(jù)是否存在,有可能就攻擊成功了。所以 or 1 = 1 有個(gè)響亮的名字,叫萬(wàn)能密碼。恐怕大家在做大學(xué)作業(yè)的時(shí)候,都有這個(gè)漏洞吧。
登錄成功后,返回的 cookie 要設(shè)置 httponly、secure,這樣就無(wú)法通過(guò) js 腳本獲取 cookie,可以防止跨站攻擊,增加爬蟲程序的難度。cookie 有效期根據(jù)業(yè)務(wù)需求決定,盡量短一些。曾經(jīng)我也做過(guò)爬蟲,爬網(wǎng)銀的時(shí)候就處理過(guò)很多這樣的 cookie,比普通 cookie 復(fù)雜很多。
如果使用手機(jī)短信登錄,一定要控制驗(yàn)證碼的時(shí)效性,即驗(yàn)證碼一次有效 5 分鐘,一分鐘內(nèi)只能發(fā)送一次。有必要時(shí)可以單點(diǎn)登錄,其他設(shè)備登錄后,本設(shè)備自動(dòng)失效。也可以使用第三方授權(quán)登錄接口,如微信登錄等,優(yōu)化用戶登錄體驗(yàn),安全性更好。
密碼安全性
盡量提升密碼強(qiáng)度。一般來(lái)說(shuō),長(zhǎng)度要 8 位以上,必須同時(shí)包含數(shù)字、小寫字母、大寫字母,建議用戶使用特殊字符。
重置密碼,最好通過(guò)郵箱發(fā)送一定時(shí)間內(nèi)有效的重置鏈接,或者手機(jī)短信驗(yàn)證碼,甚至兩者相結(jié)合的方法。安全要求特別高的場(chǎng)景,比如股票交易軟件,有的設(shè)計(jì)了一個(gè)單獨(dú)的動(dòng)態(tài)密碼 APP,通過(guò)算法比對(duì)動(dòng)態(tài)密碼。密碼保護(hù)問(wèn)題在今天隱私滿天飛的時(shí)代背景下,可能已經(jīng)不那么安全了。
用戶名密碼錯(cuò)誤提示含糊一些。無(wú)論是用戶名還是密碼錯(cuò)誤,統(tǒng)一提示“用戶名或密碼錯(cuò)誤”,不要給用戶明確的提示。這樣會(huì)在一定程度上讓忘記用戶名的用戶難以登錄,可以輔助一個(gè)用戶名找回機(jī)制或允許使用郵箱、手機(jī)號(hào)進(jìn)行登錄。
不要在瀏覽器中明文保存用戶名、密碼,md5 加密也不行。如果要自動(dòng)登錄,可以保存 RSA 加密后的密文,通過(guò) cookie 提交密文進(jìn)行解析來(lái)自動(dòng)登錄。md5 或者 md5(md5) 在今天已經(jīng)不安全了,黑客的彩虹表可能已經(jīng)覆蓋了大多數(shù)數(shù)據(jù)了。
保護(hù)好用戶
密碼落庫(kù)必須加密。CSDN當(dāng)年使用明文存儲(chǔ)密碼導(dǎo)致被脫褲后完全公開了用戶密碼,給用戶和網(wǎng)站帶來(lái)了極大的風(fēng)險(xiǎn)。基于彩虹表能夠很方便地破解 md5、sha1 等古老算法的密文,建議至少使用 sha256 及以后的算法,并且加密過(guò)程加鹽。鹽的長(zhǎng)度最好也要在 64 位以上。如果條件允許,給每個(gè)用戶設(shè)計(jì)一個(gè)獨(dú)有的鹽值,將極大提升安全性。
數(shù)據(jù)庫(kù)要保留用戶的歷史密碼,修改密碼時(shí),不能和前幾次一樣。如果黑客掌握了某個(gè)歷史密碼,也可能在用戶改回后恰好就對(duì)上了。參考 Google 賬號(hào)登錄,修改密碼和 6 個(gè)月前的一樣都是不行的。
保留用戶的登錄記錄。時(shí)間、ip 都需要。如果本次 ip 和以前的有較大的差別,可以通過(guò)郵箱、短信、站內(nèi)信等向用戶提示,建議用戶修改密碼。用戶長(zhǎng)時(shí)間沒(méi)有登錄,后續(xù)再登錄的時(shí)候最好強(qiáng)制修改密碼,并且和歷史密碼不重復(fù)。
短時(shí)間內(nèi)登錄失敗,要鎖定用戶。比如失敗 5 次可以鎖定 1 小時(shí),再次失敗鎖定 8 小時(shí),又失敗鎖定 24 小時(shí)。鎖定后,用戶可以通過(guò)注冊(cè)郵箱或手機(jī)短信實(shí)現(xiàn)解鎖,但一天內(nèi)也要限制解鎖次數(shù)。
即使在用戶登錄后,進(jìn)行重要操作的時(shí)候,也要求用戶重新輸入一次密碼。比如修改密碼、修改綁定郵箱、修改密碼保護(hù)問(wèn)題、有消費(fèi)行為等,可以防止用戶被 XSS 攻擊后黑客修改重要數(shù)據(jù)。
總結(jié)
本文梳理了設(shè)計(jì)登錄流程需要考慮的一些關(guān)鍵點(diǎn)。世界上沒(méi)有絕對(duì)安全的系統(tǒng),有價(jià)值的網(wǎng)站和應(yīng)用都是黑客攻擊的重點(diǎn)對(duì)象。工作中務(wù)必重視安全問(wèn)題,發(fā)現(xiàn)漏洞及時(shí)修復(fù)。也要考慮網(wǎng)站數(shù)據(jù)的重要程度,采取合適的防護(hù)措施。
責(zé)編AJX
-
網(wǎng)絡(luò)安全
+關(guān)注
關(guān)注
10文章
3193瀏覽量
60204 -
SQL
+關(guān)注
關(guān)注
1文章
774瀏覽量
44251 -
黑客
+關(guān)注
關(guān)注
3文章
284瀏覽量
21927
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論