web安全开发指南--认证
1、認(rèn)證
1.1、 認(rèn)證和密碼管理安全規(guī)則
|
1 |
認(rèn)證控制必須只能在服務(wù)器端執(zhí)行。 |
|
2 |
除了指定為公開的資源,對所有其它資源的訪問都必須先經(jīng)過認(rèn)證。 |
|
3 |
為所有關(guān)鍵憑證實施防“暴力破解”策略(參考暴力破解)。 |
|
4 |
當(dāng)業(yè)務(wù)系統(tǒng)需要連接到第三方系統(tǒng)并存取敏感信息時,必須要求進(jìn)行認(rèn)證,認(rèn)證的憑證不允許硬編碼到代碼中。 |
|
5 |
只使用HTTP POST請求來發(fā)送認(rèn)證憑證,并且服務(wù)器只接受POST請求。 |
|
6 |
口令必須通過加密通道來傳輸。注:所有敏感數(shù)據(jù)都要滿足此規(guī)則。 |
|
7 |
執(zhí)行口令長度和復(fù)雜度檢查【1.3、參見口令復(fù)雜度策略】。 |
|
8 |
不允許在密碼輸入框中顯示明文密碼。 |
|
9 |
為所有password類型的form或input標(biāo)簽加入AUTOCOMPLETE="off"屬性,該屬性用于告訴瀏覽器不記住當(dāng)前輸入的口令。 |
|
10 |
【可選建議】記錄用戶上一次成功登錄的信息并在下一次登錄時給予顯示。 |
|
11 |
【可選建議】使用多因素認(rèn)證,比如數(shù)字證書、短信驗證碼、動態(tài)口令等。 |
|
12 |
【可選建議】進(jìn)行關(guān)鍵操作時要求用戶重新認(rèn)證(比如輸入短信驗證碼或口令等)。 |
|
13 |
【可選建議】從訪問站點的首頁開始直到用戶登錄頁(即輸入用戶名密碼的頁面)都使用https,避免從起始的http狀態(tài)切換到https狀態(tài)(最好是全站https)。 |
1.2、 修改密碼功能
|
簡要描述 |
當(dāng)用戶密碼泄漏或者有時候用戶自己想要去修改密碼,此時需要系統(tǒng)提供“修改密碼”的功能。 |
|
|
解決方案 |
修改新密碼需要舊密碼,并且需要重新確認(rèn)一次新密碼; 其它請參考認(rèn)證和密碼管理安全規(guī)則1、3、5、6、7、8和9 |
|
|
備注 |
|
|
1.3、 口令復(fù)雜度策略
|
簡要描述 |
弱口令很容易被暴力破解,口令越弱,被暴力破解的成功率就越高。 |
|
|
解決方案 |
設(shè)置密碼最小密碼長度(建議6個字符)和最大長度(建議128個字符); 設(shè)置密碼復(fù)雜度要求(建議數(shù)字、大小字母和特殊字符4選2); 【可選建議】對用戶使用過的歷史密碼進(jìn)行hash并存儲,設(shè)置的新密碼時,使用新密碼的hash和歷史密碼的hash做對比,保證用戶不能在過短時間內(nèi)設(shè)置兩次相同密碼; 正常情況下,不允許用戶修改或關(guān)閉密碼復(fù)雜度驗證,特殊情況下,可允許只對用戶提出安全提示或允許用戶進(jìn)行關(guān)閉; |
|
|
備注 |
|
|
1.4、 口令的存儲策略
|
簡要描述 |
密碼是具有保密性的,不應(yīng)當(dāng)存在密碼被還原成明文的情況。管理員或服務(wù)人員可以在不需要舊密碼的情況下為用戶重置新密碼,因此,不存在需要還原明文的理由,常用的機(jī)制是使用哈希算法來存儲密碼,但是現(xiàn)今有些算法已經(jīng)證明是不安全的,所以應(yīng)當(dāng)確保使用時選擇足夠安全的算法。 |
|
|
解決方案 |
1.4.1、對于不需要還原口令明文的場景(以下二選一): 使用sha256對口令進(jìn)行hash后再存儲; 如果使用MD5,則應(yīng)為每個用戶口令添加獨立的salt值(比如userid)并hash后再存儲(參考附錄11.9.3); 1.4.2、對于需要還原口令明文的場景: 使用AES128或以上的強(qiáng)安全算法對口令進(jìn)行加密后再存儲(參考附錄11.9.1),并安全地保護(hù)密鑰(參考 加密解密à密鑰的保存); 1.4.3、如果沒有特殊需求,不要將口令密文或哈希值以任何形式返回給用戶。 |
|
|
備注 |
除了口令之外,對于所有被識別出來的業(yè)務(wù)敏感數(shù)據(jù)在存儲時應(yīng)滿足解決方案中的要求。 |
|
1.5、 重置密碼/找回密碼/忘記密碼
|
簡要描述 |
為重置密碼/找回密碼/忘記密碼等重要模塊提供安全開發(fā)建議。 |
|
|
解決方案 |
當(dāng)使用回答問題的方式找回密碼時,應(yīng)保證所提供的問題的答案是難以猜測的也是難以通過公共資源獲取的,同時建議需要用戶正確回答兩個或兩個以上的問題,比如,我最喜歡的一句話,我最想去的地方等等。 如果通過Email的方式重置密碼,則應(yīng)將重置密碼用的臨時URL發(fā)送到用戶的注冊的Email,并為其設(shè)置合理的有效期; 確保重置密碼的臨時URL是不可猜測和破解的; 如果使用手機(jī)驗證碼的方式重置密碼,應(yīng)保障手機(jī)驗證碼安全(參考手機(jī)驗證碼章節(jié)); 其它請參考證和認(rèn)證和密碼管理安全規(guī)則規(guī)則1、3、5、6、7、8和9。 |
|
|
備注 |
|
|
1.6、 暴力破解
|
簡要描述 |
應(yīng)用程序必須要有足夠的手段來抵御暴力破解和字典攻擊。 |
|
|
解決方案 |
對暴力攻擊行實施圖形驗證碼或賬戶鎖定策略,如果選擇鎖定策略,不可對賬戶進(jìn)行永久鎖定以避免造成拒絕服務(wù)攻擊; 當(dāng)認(rèn)證失敗時,不要告訴用戶登錄失敗的具體原因,比如用戶名不存在,密碼不正確等,可只列舉所有可能失敗的原因; 【可選建議】在日志里記錄用戶每一次登錄的信息,最起碼要記錄用戶登錄失敗的信息; 【可選建議】嘗試阻止同一個IP多次失敗地去登錄不同的賬戶; 【可選建議】如果用戶已登錄,進(jìn)行多次關(guān)鍵操作失敗后強(qiáng)制注銷session(比如修改密碼和校驗短信驗證碼等等); |
|
|
備注 |
|
|
1.7、 自動登錄功能
|
簡要描述 |
該功能可以讓用戶返回原先訪問的站點而不需要重新認(rèn)證,對于在公共網(wǎng)絡(luò)的用戶來說是相當(dāng)危險的。 |
|
|
解決方案 |
對于安全性要求較高的應(yīng)用場景,不應(yīng)當(dāng)提供自動登錄的功能,如果必須提供,應(yīng)提示用戶可能會存在的風(fēng)險; 為持久性cookie設(shè)置合理的期限(建議不超過3天)。 |
|
|
備注 |
|
|
1.8、 手機(jī)驗證碼
|
簡要描述 |
對于對安全性有一定要求的場合,手機(jī)驗證碼提供了更加安全的保障,用戶只有輸入系統(tǒng)發(fā)送的短信驗證碼方可進(jìn)一步操作。 |
|
|
解決方案 |
設(shè)置適當(dāng)?shù)氖謾C(jī)驗證碼長度(至少4位純數(shù)字); 為需要驗證手機(jī)驗證碼的請求設(shè)置防暴力破解機(jī)制(比如 多次嘗試賬戶鎖定和驗證碼失效等); 限制單個賬戶調(diào)用短信網(wǎng)關(guān)接口的頻度(建議1分鐘1次)。 為手機(jī)驗證碼設(shè)置合適的自動失效期(建議0.5-1個小時); 手機(jī)驗證碼使用后應(yīng)立即失效。 |
|
|
備注 |
|
|
1.9、 圖形驗證碼
|
簡要描述 |
圖形驗證碼可以用來防御多種非人為操作的自動化攻擊。 |
|
|
解決方案 |
保證在判斷驗證碼之后再對請求做進(jìn)一步處理; 使用強(qiáng)隨機(jī)性函數(shù)產(chǎn)生驗證碼; 為驗證碼圖片背景添加噪聲; 圖形驗證碼的形體盡量隨機(jī)變化; 圖形驗證碼在使用一次后立馬失效。 未使用的圖形驗證碼必須具有時效性。 |
|
|
備注 |
|
|
總結(jié)
以上是生活随笔為你收集整理的web安全开发指南--认证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java语言编写进制转换_Java 3种
- 下一篇: peewee创建mysql_python