
Java安全編碼高級(jí)培訓(xùn)
1 安全編碼概述
1.1 錯(cuò)位的信任
1.2 注入攻擊
1.3 敏感數(shù)據(jù)泄露
1.4 效能泄露
1.5 拒絕服務(wù)
1.6 序列化
1.7 并發(fā)性、可見性和內(nèi)存
1.8 低權(quán)限原則
1.9 安全管理器
1.10 類裝載器
2 輸入驗(yàn)證和數(shù)據(jù)凈化(IDS)規(guī)則風(fēng)險(xiǎn)評(píng)估概要
2.1 凈化穿越受信邊界的非受信數(shù)據(jù)
2.2 驗(yàn)證前標(biāo)準(zhǔn)化字符串
2.3 在驗(yàn)證之前標(biāo)準(zhǔn)化路徑名
2.4 不要記錄未經(jīng)凈化的用戶輸入
2.5 限制傳遞給ZipInputStream的文件大小
2.6 使用ASCII字符集的子集作為文件名和路徑名
2.7 從格式字符串中排除用戶輸入
2.8 不要向Runtime.exec 方法傳遞非受信、未凈化的數(shù)據(jù)
3 聲明和初始化(DCL)規(guī)則風(fēng)險(xiǎn)評(píng)估概要
3.1 防止類的循環(huán)初始化;
3.2 不要重用Java標(biāo)準(zhǔn)庫(kù)的已經(jīng)公開的標(biāo)識(shí);
3.3 將所有增強(qiáng)for語(yǔ)句的循環(huán)變量聲明為final類型
4 表達(dá)式(EXP)規(guī)則風(fēng)險(xiǎn)評(píng)估概要
4.1 不要忽略方法的返回值
4.2 不要解引用空指針
4.3 使用兩個(gè)參數(shù)的Arrays.equals方法來(lái)比較兩個(gè)數(shù)組的內(nèi)容
4.4 不要用相等操作符來(lái)比較兩個(gè)基礎(chǔ)數(shù)據(jù)類型的值
4.5 確保使用正確的類型來(lái)自動(dòng)封裝數(shù)值
4.6 不要在一個(gè)表達(dá)式中對(duì)同一變量進(jìn)行多次寫入
4.7 不要在斷言中使用有副作用的表達(dá)式
5 數(shù)值類型與運(yùn)算(NUM)規(guī)則風(fēng)險(xiǎn)評(píng)估概要
5.1 檢測(cè)和避免整數(shù)溢出
5.2 不要對(duì)同一數(shù)據(jù)進(jìn)行位運(yùn)算和數(shù)學(xué)運(yùn)算
5.3 確保除法運(yùn)算和模運(yùn)算中的除數(shù)不為0
5.4 使用可容納無(wú)符號(hào)數(shù)據(jù)合法取值范圍的整數(shù)類型
5.5 不要使用浮點(diǎn)數(shù)進(jìn)行精細(xì)計(jì)算
5.6 不要使用非標(biāo)準(zhǔn)化數(shù)
5.7 使用strictfp修飾符確??缙脚_(tái)浮點(diǎn)運(yùn)算的一致性
5.8 不要嘗試與NaN進(jìn)行比較
5.9 檢查浮點(diǎn)輸入特殊的數(shù)值
5.10 不要從浮點(diǎn)字元構(gòu)造BigDecimal對(duì)象
5.11 不要使用浮點(diǎn)變量作為循環(huán)計(jì)數(shù)器
5.11.1 確保將數(shù)值轉(zhuǎn)換成較小類型時(shí)不會(huì)產(chǎn)生數(shù)據(jù)丟失或曲解
6 面向?qū)ο螅∣BJ)規(guī)則風(fēng)險(xiǎn)評(píng)估概要
6.1 只有受信子類能對(duì)具有不變性的類和方法進(jìn)行擴(kuò)展
6.2 聲明數(shù)據(jù)成員為私有并提供可訪問(wèn)的封裝器方法
6.3 當(dāng)改變基類時(shí),保存子類之間的依賴關(guān)系
6.4 在新代碼中,不要混用具有泛型和非泛型的原始數(shù)據(jù)類型
6.5 為可變類提供復(fù)制功能,并通過(guò)此功能允許將實(shí)例傳遞給非受信代碼
6.6 在返回引用之前,防御性復(fù)制私有的可變的類成員
6.7 對(duì)可變輸入和可變的內(nèi)部組件創(chuàng)建防御性復(fù)制
6.8 不允許敏感類復(fù)制其自身
6.9 不要在嵌套類中暴露外部類的私有字段
6.10 比較類而不是類名稱
6.11 不要使用公有靜態(tài)的非final變量
6.12 小心處理構(gòu)造函數(shù)拋出異常的情況
7 方法(MET)規(guī)則風(fēng)險(xiǎn)評(píng)估概要
7.1 驗(yàn)證方法參數(shù)
7.2 不要使用斷言驗(yàn)證方法參數(shù)
7.3 不要使用棄用的或過(guò)時(shí)的類和方法
7.4 進(jìn)行安全檢測(cè)的方法必須聲明為private或final
7.5 不要增加被覆寫方法和被隱藏方法的可訪問(wèn)性
7.6 確保構(gòu)造函數(shù)不會(huì)調(diào)用可覆寫的方法
7.7 不要在clone中調(diào)用可覆寫的方法
7.8 不要定義類方法來(lái)隱藏基類或基類接口中聲明的方法
7.9 確保比較等同的對(duì)象能得到相等的結(jié)果
7.10 定義了equlas方法的類必須定義hashCode方法
7.11 實(shí)現(xiàn)compareTo方法時(shí)遵守常規(guī)合約
7.12 確保比較中的關(guān)鍵碼是不可變的
7.13 不要使用析構(gòu)函數(shù)
8 異常行為(ERR)規(guī)則風(fēng)險(xiǎn)評(píng)估概要
8.1 不要消除或忽略可檢查的異常
8.2 不能允許異常泄露敏感信息
8.3 記錄日志時(shí)應(yīng)避免異常
8.4 在方法失敗時(shí)恢復(fù)對(duì)象先前的狀態(tài)
8.5 不要在finally程序段非正常退出
8.6 不要在finally程序段中遺漏可檢查異常
8.7 不要拋出未聲明的可檢查異常
8.8 不要拋出RuntimeException、Exception或Throwable
8.9 不要捕捉NullPointerException或任何它的基類
8.10 禁止非受信代碼終止JVM
9 可見性和原子性(VNA)規(guī)則風(fēng)險(xiǎn)評(píng)估概要
9.1 當(dāng)需要讀取共享基礎(chǔ)數(shù)據(jù)類型變量時(shí),需要保證其可見性
9.2 保證對(duì)一個(gè)不可變對(duì)象的共享引用的可見性
9.3 保證對(duì)于共享變量的組合操作是原子性的
9.4 即使每一個(gè)方法都是相互獨(dú)立并且是原子性的,也不要假設(shè)一組調(diào)用是原子性的
9.5 保證串聯(lián)在一起的方法調(diào)用是原子性的
9.6 保證在讀寫64位的數(shù)值時(shí)的原子性