Java安全編碼標准


  1. Java安全編碼標准

 

具體參考Rules

 

 

    1. 輸入驗證和數據凈化(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兩端使用兼容的編碼方式

 

    1. 聲明和初始化(DCL)規則風險評估概要

DCL00-J防止類的循環初始化

DCL01-J不要重用Java標准庫的已經公開的標識

DCL02-J將所有增強for語句的循環變量聲明為final類型

 

    1. 表達式(EXP)規則風險評估概要

EXP00-J不要忽略方法的返回值

EXP01-J不要解引用空指針

EXP02-J使用兩個參數的Arrays.equals方法來比較兩個數組的內容

EXP03-J不要用相等操作符來比較兩個基礎數據類型的值

EXP04-J確保使用正確的類型來自動封裝數值

EXP05-J不要在一個表達式中對同一變量進行多次寫入

EXP06-J不要在斷言中使用有副作用的表達式

 

    1. 數值類型與運算(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轉換基本整數類型至浮點類型時應避免精度損失

 

    1. 面向對象(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小心處理構造函數拋出異常的情況

 

    1. 方法(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不要使用析構函數

 

    1. 異常行為(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

 

    1. 可見性和原子性(VNA)規則風險評估概要

VNA00-J當需要讀取共享基礎數據類型變量時,需要保證其可見性

VNA01-J保證對一個不可變對象的共享引用的可見性

VNA02-J保證對於共享變量的組合操作是原子性的

VNA03-J即使每一個方法都是相互獨立並且是原子性的,也不要假設一組調用是原子性的

VNA04-J保證串聯在一起的方法調用是原子性的

VNA05-J保證在讀寫64位的數值時的原子性

 

    1. 鎖(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當使用那些不能對鎖策略進行承諾的類時,避免使用客戶端鎖定

 

    1. 線程API(THI)規則風險評估概要

THI00-J不要調用Thread.run

THI01-J不能調用ThreadGroup方法

THI02-J通知所有等待中的線程而不是單一線程

THI03-J始終在循環中調用wait和await方法

THI04-J確保可以終止受阻線程

THI05-J不要使用Thread.stop來終止線程

 

    1. 線程池(TPS)規則風險評估概要

TPS00-J使用線程池處理流量突發以實現降低性能運行

TPS01-J不要使用有限的線程池來執行相互依賴的任務

TPS02-J確保提交至線程池的任務是可中斷的

TPS03-J確保線程池中正在執行的任務不會失敗而不給出任何提示

TPS04-J使用線程池時,確保ThreadLocal變量可以重新初始化

 

    1. 與線程安全相關的其他規則(TSM)規則風險評估概要

TSM00-J不要使用非線程安全方法來覆寫線程安全方法

TSM01-J不要讓this引用在創建對象時泄漏

TSM02-J不要在初始化類時使用后台線程

TSM03-J不要發布部分初始化的對象

 

    1. 輸入輸出(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在程序終止時執行正確的清理動作

 

    1. 序列化(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防止覆蓋外部化的對象

 

    1. 平台安全性(SEC)規則風險評估概要

SEC00-J不要允許特權代碼塊越過受信邊界泄露敏感信息

SEC01-J不要在特權代碼塊中使用污染過的變量

SEC02-J不要基於非受信源進行安全檢查

SEC03-J不要在允許非受信代碼裝載任意類之后裝載受信類

SEC04-J使用安全管理器檢查來保護敏感操作

SEC05-J不要使用反射來增加類、方法和字段的可訪問性

SEC06-J不要依賴於默認的由URLClassLoader和java.util.jar提供的自動化簽名檢查

SEC07-J當編寫一個自定義的類裝載器時調用基類的getPermissions方法

SEC08-J定義基於原生方法的封裝器

 

    1. 運行環境(ENV)規則風險評估概要

ENV00-J不要簽名只執行非特權操作的代碼

ENV01-J將所有安全敏感的代碼置於單獨一個jar包中,並且在簽名之后封裝它

ENV02-J不要信任環境變量的值

ENV03-J不要賦予危險的權限組合

ENV04-J不要關閉字節碼驗證功能

ENV05-J不要部署一個被遠程監視的應用

 

    1. 其他(MSC)規則風險評估概要

MSC00-J在交換安全數據時使用SSLSocket而不是Socket

MSC01-J不要使用空的無限循環

MSC02-J生成強隨機數

MSC03-J不要硬編碼敏感信息

MSC04-J防止內存泄漏

MSC05-J不要耗盡堆空間

MSC06-J當一個遍歷正在進行時,不要修改它對應的集合

MSC07-J防止多次實例化單例對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM