- Java安全編碼標准
具體參考Rules
-
- 輸入驗證和數據凈化(IDS)規則風險評估概要
IDS00-J凈化穿越受信邊界的非受信數據
IDS01-J驗證前標准化字符串
IDS02-J在驗證之前標准化路徑名
IDS03-J不要記錄未經凈化的用戶輸入
IDS04-J限制傳遞給ZipInputStream的文件大小
IDS05-J使用ASCII字符集的子集作為文件名和路徑名
IDS06-J從格式字符串中排除用戶輸入
IDS07-J不要向Runtime.exec 方法傳遞非受信、未凈化的數據
IDS08-J凈化傳遞給正則表達式的非受信數據
DS09-J如果沒有指定適當的locale,不要使用locale相關方法處理與locale相關的數據
IDS10-J不要拆分兩種數據結構中的字符串
IDS11-J在驗證前去掉非字符碼點
IDS12-J在不同的字符編碼中無損轉換字符串數據
IDS13-J在文件或者網絡I/O兩端使用兼容的編碼方式
-
- 聲明和初始化(DCL)規則風險評估概要
DCL00-J防止類的循環初始化
DCL01-J不要重用Java標准庫的已經公開的標識
DCL02-J將所有增強for語句的循環變量聲明為final類型
-
- 表達式(EXP)規則風險評估概要
EXP00-J不要忽略方法的返回值
EXP01-J不要解引用空指針
EXP02-J使用兩個參數的Arrays.equals方法來比較兩個數組的內容
EXP03-J不要用相等操作符來比較兩個基礎數據類型的值
EXP04-J確保使用正確的類型來自動封裝數值
EXP05-J不要在一個表達式中對同一變量進行多次寫入
EXP06-J不要在斷言中使用有副作用的表達式
-
- 數值類型與運算(NUM)規則風險評估概要
NUM00-J檢測和避免整數溢出
NUM01-J不要對同一數據進行位運算和數學運算
NUM02-J確保除法運算和模運算中的除數不為0
NUM03-J使用可容納無符號數據合法取值范圍的整數類型
NUM04-J不要使用浮點數進行精細計算
NUM05-J不要使用非標准化數
NUM06-J使用strictfp修飾符確保跨平台浮點運算的一致性
NUM07-J不要嘗試與NaN進行比較
NUM08-J檢查浮點輸入特殊的數值
NUM09-J不要使用浮點變量作為循環計數器
NUM10-J不要從浮點字元構造BigDecimal對象
NUM11-J不要比較或者審查以字符串表達的浮點數值
NUM12-J確保將數值轉換成較小類型時不會產生數據丟失或曲解
NUM13-J轉換基本整數類型至浮點類型時應避免精度損失
-
- 面向對象(OBJ)規則風險評估概要
OBJ00-J只有受信子類能對具有不變性的類和方法進行擴展
OBJ01-J聲明數據成員為私有並提供可訪問的封裝器方法
OBJ02-J當改變基類時,保存子類之間的依賴關系
OBJ03-J在新代碼中,不要混用具有泛型和非泛型的原始數據類型
OBJ04-J為可變類提供復制功能,並通過此功能允許將實例傳遞給非受信代碼
OBJ05-J在返回引用之前,防御性復制私有的可變的類成員
OBJ06-J對可變輸入和可變的內部組件創建防御性復制
OBJ07-J不允許敏感類復制其自身
OBJ08-J不要在嵌套類中暴露外部類的私有字段
6.10 OBJ09-J比較類而不是類名稱
OBJ10-J不要使用公有靜態的非final變量
OBJ11-J小心處理構造函數拋出異常的情況
-
- 方法(MET)規則風險評估概要
MET00-J驗證方法參數
MET01-J不要使用斷言驗證方法參數
MET02-J不要使用棄用的或過時的類和方法
MET03-J進行安全檢測的方法必須聲明為private或final
MET04-J不要增加被覆寫方法和被隱藏方法的可訪問性
MET05-J確保構造函數不會調用可覆寫的方法
MET06-J不要在clone中調用可覆寫的方法
MET07-J不要定義類方法來隱藏基類或基類接口中聲明的方法
MET08-J確保比較等同的對象能得到相等的結果
MET09-J定義了equlas方法的類必須定義hashCode方法
MET10-J實現compareTo方法時遵守常規合約
MET11-J確保比較中的關鍵碼是不可變的
MET12-J不要使用析構函數
-
- 異常行為(ERR)規則風險評估概要
ERR00-J不要消除或忽略可檢查的異常
ERR01-J不能允許異常泄露敏感信息
ERR02-J記錄日志時應避免異常
ERR03-J在方法失敗時恢復對象先前的狀態
ERR04-J不要在finally程序段非正常退出
ERR05-J不要在finally程序段中遺漏可檢查異常
ERR06-J不要拋出未聲明的可檢查異常
ERR07-J不要拋出RuntimeException、Exception或Throwable
ERR08-J不要捕捉NullPointerException或任何它的基類
ERR09-J禁止非受信代碼終止JVM
-
- 可見性和原子性(VNA)規則風險評估概要
VNA00-J當需要讀取共享基礎數據類型變量時,需要保證其可見性
VNA01-J保證對一個不可變對象的共享引用的可見性
VNA02-J保證對於共享變量的組合操作是原子性的
VNA03-J即使每一個方法都是相互獨立並且是原子性的,也不要假設一組調用是原子性的
VNA04-J保證串聯在一起的方法調用是原子性的
VNA05-J保證在讀寫64位的數值時的原子性
-
- 鎖(LCK)規則風險評估概要
LCK00-J通過私有final鎖對象可以同步那些與非受信代碼交互的類
LCK01-J不要基於那些可能被重用的對象進行同步
LCK02-J不要基於那些通過getClass返回的類對象來實現同步
LCK03-J不要基於高層並發對象的內置鎖來實現同步
LCK04-J即使集合是可訪問的,也不要基於集合視圖使用同步
LCK05-J對那些可以被非受信代碼修改的靜態字段,需要同步進入
LCK06-J不要使用一個實例鎖來保護共享靜態數據
LCK07-J使用相同的方式請求和釋放鎖來避免死鎖
LCK08-J在異常條件時,保證釋放已經持有的鎖
LCK09-J不要執行那些持有鎖時會阻塞的操作
LCK10-J不要使用不正確形式的雙重鎖定檢查慣用法
LCK11-J當使用那些不能對鎖策略進行承諾的類時,避免使用客戶端鎖定
-
- 線程API(THI)規則風險評估概要
THI00-J不要調用Thread.run
THI01-J不能調用ThreadGroup方法
THI02-J通知所有等待中的線程而不是單一線程
THI03-J始終在循環中調用wait和await方法
THI04-J確保可以終止受阻線程
THI05-J不要使用Thread.stop來終止線程
-
- 線程池(TPS)規則風險評估概要
TPS00-J使用線程池處理流量突發以實現降低性能運行
TPS01-J不要使用有限的線程池來執行相互依賴的任務
TPS02-J確保提交至線程池的任務是可中斷的
TPS03-J確保線程池中正在執行的任務不會失敗而不給出任何提示
TPS04-J使用線程池時,確保ThreadLocal變量可以重新初始化
-
- 與線程安全相關的其他規則(TSM)規則風險評估概要
TSM00-J不要使用非線程安全方法來覆寫線程安全方法
TSM01-J不要讓this引用在創建對象時泄漏
TSM02-J不要在初始化類時使用后台線程
TSM03-J不要發布部分初始化的對象
-
- 輸入輸出(FIO)規則風險評估概要
FIO00-J不要操作共享目錄中的文件
FIO01-J使用合適的訪問權限創建文件
FIO02-J發現並處理與文件相關的錯誤
FIO03-J在終止前移除臨時文件
FIO04-J在不需要時關閉資源
FIO05-J不要使用wrap或duplicate創建緩存,並將這些緩存暴露給非受信代碼
FIO06-J不能在一個單獨的InputStream上創建多個緩存區封裝器
FIO07-J不要讓外部進程阻塞輸入和輸出流
FIO08-J對讀取一個字符或者字節的方法,使用int類型的返回值
FIO09-J不要使用write方法輸出超過0~255的整數
FIO10-J使用read方法保證填充一個數組
FIO11-J不要將原始的二進制數據作為字符數據讀入
FIO12-J為小端數據的讀寫提供方法
FIO13-J不要在受信邊界之外記錄敏感信息
FIO14-J在程序終止時執行正確的清理動作
-
- 序列化(SER)規則風險評估概要
SER00-J在類的演化過程中維護其序列化的兼容性
SER01-J不要偏離序列化方法的正確簽名
SER02-J在將對象向信任邊界之外發送時,需要簽名並且封裝敏感對象
SER03-J不要序列化未經加密的敏感數據
SER04-J不要允許序列化和反序列化繞過安全管理器
SER05-J不要序列化內部類實例
SER06-J在反序列化時,對私有的可變的組件進行防御性復制
SER07-J不要對實現定義的不可變因素使用默認的序列化格式
SER08-J在從擁有特性的環境中進行反序列化之前最小化特權
SER09-J不要從readObject方法中調用可以被覆寫的方法
SER10-J在序列化時,避免出現內存和資源泄漏
SER11-J防止覆蓋外部化的對象
-
- 平台安全性(SEC)規則風險評估概要
SEC00-J不要允許特權代碼塊越過受信邊界泄露敏感信息
SEC01-J不要在特權代碼塊中使用污染過的變量
SEC02-J不要基於非受信源進行安全檢查
SEC03-J不要在允許非受信代碼裝載任意類之后裝載受信類
SEC04-J使用安全管理器檢查來保護敏感操作
SEC05-J不要使用反射來增加類、方法和字段的可訪問性
SEC06-J不要依賴於默認的由URLClassLoader和java.util.jar提供的自動化簽名檢查
SEC07-J當編寫一個自定義的類裝載器時調用基類的getPermissions方法
SEC08-J定義基於原生方法的封裝器
-
- 運行環境(ENV)規則風險評估概要
ENV00-J不要簽名只執行非特權操作的代碼
ENV01-J將所有安全敏感的代碼置於單獨一個jar包中,並且在簽名之后封裝它
ENV02-J不要信任環境變量的值
ENV03-J不要賦予危險的權限組合
ENV04-J不要關閉字節碼驗證功能
ENV05-J不要部署一個被遠程監視的應用
-
- 其他(MSC)規則風險評估概要
MSC00-J在交換安全數據時使用SSLSocket而不是Socket
MSC01-J不要使用空的無限循環
MSC02-J生成強隨機數
MSC03-J不要硬編碼敏感信息
MSC04-J防止內存泄漏
MSC05-J不要耗盡堆空間
MSC06-J當一個遍歷正在進行時,不要修改它對應的集合
MSC07-J防止多次實例化單例對象