Java Security Develop
1. 拒絕服務(wù) DDOS
xml外部實體攻擊(阻塞)
- 定義白名單
- 自定義 EntityResolver 接口
- 過濾 systemID
文件資源釋放:
final InputStream in = new FileInputStream(file);
try {
use (in);
} finally {
{} in.close();
}
數(shù)據(jù)庫資源釋放
connection给涕,statement相种,resultset
注意實現(xiàn)方法:配置實現(xiàn)/編碼實現(xiàn)
2. 敏感信息
-
避免直接輸出異常信息
try { excute(Exception e) { e.printStackTrace(); } }
-
避免日志輸出 sensitive info
if (loginSuccessful) { logger.save("User.."+name+...) }
3. 注入問題
-
使用函數(shù)對外部輸入標(biāo)準(zhǔn)化
// Nomalize s = Normalizer.normalize(s, Form.NFKC); // Validate (declare or make legally valid) Pattern pattern = Pattern.compile("[<>]"); Matcher matcher = pattern.mattcher(s); if (matcher.find()) { // Found black listed tag throw new IllegalStateException(); }
動態(tài)SQL
參數(shù)化查詢
PreparedStatement prep = conn.prepareStatement("SELECT * FROM USERS WHERE PASSWORD = ?");
prep.setString(1, pwd);
過濾敏感字符
前端過濾 服務(wù)器端過濾
'|and|exec|insert|select|delete|upadte|count|* |'
- XML 注入問題
XSD約束,過濾敏感字符
Xpath注入
命令行注入
Runtime.exec() 過濾凳宙,白名單 繞過不使用runtime.exec(),使用api來 ls/dir
- 正則表達(dá)式注入
4. 可訪問性和擴(kuò)展性
- 限制類狂巢,接口阎曹,方法和字段的可訪問
- 包的訪問權(quán)限昙衅,防止反射
- Final類和方法度帮。不允許擴(kuò)展類和方法聲明final
5. 序列化和反序列化 Transient
在包含系統(tǒng)資源的直接句柄和相對地址空間信息的字段前使用 transient 關(guān)鍵字歼捏。
如果資源,如文件句柄不聲明為transient笨篷,該對象在序列化狀態(tài)下可能被修改瞳秽,從而使反序列化獲取對資源的不當(dāng)訪問。
敏感資源加密后再序列化率翅。
6. 編碼問題
-
調(diào)用方法的返回值(錯誤示范)
public void deleteFile() {
File someFile = new File("someFileName.txt")
// do something with some File
someFile.delete();
}
正確示范:public void deleteFile() { File some...; if (!someFile.delete()){ // handle faiure to delete the file } }
空指針引用
NullPointerException 判斷是否為空
- 整數(shù)溢出
向上類型轉(zhuǎn)換练俐,使用BigInteger
- == 與 equals
類型,地址的比較的不同
在比較對象時冕臭,未明確實現(xiàn)equals的類會導(dǎo)致繼承java.lang.Object的equal
而Object.equals()將比較兩個對象實例而不是對象成員腺晾,所以equals方法要盡量重寫
- 返回數(shù)組問題
安全代碼
public class XXX {
private String[] xxx;
public String[] getXXX() {
String temp[] = Arrays.copyof(...);
return temp;
}
}
- 讀取字節(jié)/符流
使用int類型的返回值燕锥,防止byte中255補(bǔ)碼為-1中止
安全代碼
FileInputStream in;
// initialize stream
int inbuff;
byte data;
while((inbuff=in.read()) !=-1) {
data=(byte)inbuff;
// ...
}
FileReader in;
//initialize stream
int inbuff;
char data;
while((inbuff=in.read() !=-1)) {
data=(char)inbuff;
// ...
}
- 本地方法調(diào)用安全
載入時傳入?yún)?shù)檢查,防止java平臺之外的問題
- Double解析問題
java.lang.Double.parseDouble() 6.0版本以下的漏洞
7. 第三方組件安全問題
測試 加固 更新
8. 程序設(shè)計與檢測
- 程序僅僅實現(xiàn)指定功能
- 永不信任用戶輸入
- 必須考慮異常情況并處理
- 不在error之后繼續(xù)執(zhí)行
- 盡可能的使用安全函數(shù)
- 使用源碼檢測產(chǎn)品