摘要:本文是來自Sun官方站點的一篇關于如何編寫安全的java代碼的指南,開發者在編寫一般代碼時,可以參照本文的指南
• 靜態字段
• 縮小作用域
• 公共方法和字段
• 保護包
• equals方法
• 假如可能使對象不可改變
• 不要返回指向包含敏感數據的內部數組的引用
• 不要直接存儲用戶提供的數組
• 序列化
• 原生函數
• 清除敏感信息
靜態字段
• 避免使用非final的公共靜態變量
應盡可能地避免使用非final公共靜態變量,因為無法判定代碼有無權限改變這些變量值。
• 一般地,應謹慎使用易變的靜態狀態,因為這可能導致設想中相互獨立的子系統之間發生不可預知的交互。
縮小作用域
作為一個慣例,盡可能縮小方法和字段的作用域。檢查包訪問權限的成員能否改成私有的,保護類型的成員可否改成包訪問權限的或者私有的,等等。
公共方法/字段
避免使用公共變量,而是使用訪問器方法訪問這些變量。用這種方式,假如需要,可能增加集中安全控制。
對于任何公共方法,假如它們能夠訪問或修改任何敏感內部狀態,務必使它們包含安全控制。
參考如下代碼段,該代碼段中不可信任代碼可能設置TimeZone的值:
以下是引用片段:
PRivate static TimeZone defaultZone = null;
public static synchronized void setDefault(TimeZone zone)
{
defaultZone = zone;
}
保護包
有時需要在全局防止包被不可信任代碼訪問,本節描述了一些防護技術:
• 防止包注入:假如不可信任代碼想要訪問類的包保護成員,可以嘗試在被攻擊的包內定義自己的新類用以獲取這些成員的訪問權。防止這類攻擊的方式有兩種:
1. 通過向java.security.properties文件中加入如下文字防止包內被注入惡意類。
...
package.definition=Package#1 [,Package#2,...,Package#n]
...
這會導致當試圖在包內定義新類時類裝載器的defineClass方法會拋出異常,除非賦予代碼一下權限:
...
RuntimePermission("defineClassInPackage."+package)
...
2. 另一種方式是通過將包內的類加入到封裝的Jar文件里。
(參看http://java.sun.com/j2se/sdk/1.2/do...ons/spec.Html)
通過使用這種技巧,代碼無法獲得擴展包的權限,因此也無須修改java.security.properties文件。
• 防止包訪問:通過限制包訪問并僅賦予特定代碼訪問權限防止不可信任代碼對包成員的訪問。通過向java.security.properties文件中加入如下文字可以達到這一目的:
...
package.access=Package#1 [,Package#2,...,Package#n]
新聞熱點
疑難解答