

下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 安全編碼規范版本號:V1。0修訂頁編號章節名稱修訂內容簡述修訂日期修訂前版本號修訂后版本號修訂人批準人目 錄1目的52背景53安全編碼規范53。1輸入驗證和數據合法性校驗53。1.1避免SQL注入53.1.2避免XML注入53.1。3避免跨站點腳本(XSS)63。2聲明和初始化63.2.1避免類初始化的相互依賴63。3表達式73。3。1不可忽略方法的返回值73。3。2不要引用空指針83.3.3使用Arrays。equals()來比較數組的內容83.4數字類型和操作83.4.1防止整數溢出83.4.2避免除法和取模運算分母為零93.5類和方法操作103.5。1數據成員聲明為私有,提供可訪問的包
2、裝方法103.5.2敏感類不允許復制103.5.3比較類的正確做法103。5。4不要硬編碼敏感信息113.5。5驗證方法參數113.5.6不要使用過時、陳舊或低效的方法113。5。7數組引用問題113.5.8不要產生內存泄露123。6異常處理123。6。1不要忽略捕獲的異常123。6.2不允許暴露異常的敏感信息133.6.3不允許拋出RuntimeException, Exception,Throwable143.6。4不要捕獲NullPointerException或其他父類異常143.7多線程編程153。7.1確保共享變量的可見性153。7。2確保共享變量的操作是原子的163.7。3不要調
3、用Thread。run(),不要使用Thread.stop()以終止線程183。7。4確保執行阻塞操作的線程可以終止183。7.5相互依存的任務不要在一個有限的線程池執行193。8輸入輸出193.8.1程序終止前刪除臨時文件193。8.2檢測和處理文件相關的錯誤193。8.3及時釋放資源193。9序列化203。9.1不要序列化未加密的敏感數據203。9.2在序列化過程中避免內存和資源泄漏213。9。3反序列化要在程序最小權限的安全環境中221 安全編碼規范1.1 輸入驗證和數據合法性校驗程序接受數據可能來源于未經驗證的用戶,網絡連接和其他不受信任的來源,如果未對程序接受數據進行校驗,則可能會引
4、發安全問題。1.1.1 避免SQL注入使用PreparedStatement預編譯SQL,解決SQL注入問題,傳遞給PreparedStatement對象的參數可以被強制進行類型轉換,確保在插入或查詢數據時與底層的數據庫格式匹配. String sqlString = "select from db_user where username=? and password=?”;PreparedStatement stmt = connection。prepareStatement(sqlString);stmt。setString(1, username);stmt。setS
5、tring(2, pwd);ResultSet rs = stmt.executeQuery();1.1.2 避免XML注入通過StringBulider 或 StringBuffer 拼接XML文件時,需對輸入數據進行合法性校驗.對數量quantity 進行合法性校驗,控制只能傳入0-9的數字:if (!Pattern.matches("09+", quantity)) / Format violation String xmlString = "<item>ndescriptionWidget/descriptionn" + ”<p
6、rice500/pricen” + "quantity" + quantity + "/quantity></item"; outStream.write(xmlString。getBytes(); outStream。flush();1.1.3 避免跨站點腳本(XSS)對產生跨站的參數進行嚴格過濾,禁止傳入SCRIPT>標簽/定義需過濾的字段串 <scriptString s = "uFE64” + "script” + ”uFE65”;/ 過濾字符串標準化s = Normalizer.normalize(s
7、, Form.NFKC);/ 使用正則表達式匹配inputStr是否存在<scriptPattern pattern = Ppile(inputStr);Matcher matcher = pattern。matcher(s);if (matcher。find()) / Found black listed tag throw new IllegalStateException(); else / .1.2 聲明和初始化1.2.1 避免類初始化的相互依賴例:錯誤的寫法:public class Cycle private final int balance; private static
8、 final Cycle c = new Cycle(); private static final int deposit = (int) (Math.random() * 100); / Random deposit public Cycle() balance = deposit 10; / Subtract processing fee public static void main(String args) System.out.println("The account balance is: " + c。balance); 類加載時初始化指向Cycle類的靜態變
9、量c,而類Cycle的無參構造方法又依賴靜態變量deposit,導致無法預期的結果.正確的寫法:public class Cycle private final int balance; private static final int deposit = (int) (Math.random() * 100); / Random deposit private static final Cycle c = new Cycle(); / Inserted after initialization of required fields public Cycle() balance = depos
10、it 10; / Subtract processing fee public static void main(String args) System。out。println("The account balance is: ” + c.balance); 1.3 表達式1.3.1 不可忽略方法的返回值忽略方法的放回值可能會導致無法預料的結果。錯誤的寫法:public void deleteFile() File someFile = new File("someFileName.txt”); someFile。delete();正確的寫法:public void del
11、eteFile() File someFile = new File(”someFileName。txt"); if (!someFile。delete() / handle failure to delete the file 1.3.2 不要引用空指針當一個變量指向一個NULL值,使用這個變量的時候又沒有檢查,這時會導致。NullPointerException。在使用變量前一定要做是否為NULL值的校驗.1.3.3 使用Arrays。equals()來比較數組的內容數組沒有覆蓋的Object。 equals()方法,調用Object。 equals()方法實際上是比較數組的引用
12、,而不是他們的內容。程序必須使用兩個參數Arrays。equals()方法來比較兩個數組的內容public void arrayEqualsExample() int arr1 = new int20; / initialized to 0 int arr2 = new int20; / initialized to 0 Arrays。equals(arr1, arr2); / true1.4 數字類型和操作1.4.1 防止整數溢出使用java。lang.Number. BigInteger類進行整數運算,防止整數溢出.public class BigIntegerUtil private s
13、tatic final BigInteger bigMaxInt = BigInteger.valueOf(Integer.MAX_VALUE); private static final BigInteger bigMinInt = BigInteger。valueOf(Integer。MIN_VALUE); public static BigInteger intRangeCheck(BigInteger val) throws ArithmeticException if (pareTo(bigMaxInt) = 1 pareTo(bigMinInt) = 1) throw new Ar
14、ithmeticException("Integer overflow"); return val; public static int addInt(int v1, int v2) throws ArithmeticException BigInteger b1 = BigInteger。valueOf(v1); BigInteger b2 = BigInteger。valueOf(v2); BigInteger res = intRangeCheck(b1.add(b2)); return Value(); public static int subInt
15、(int v1, int v2) throws ArithmeticException BigInteger b1 = BigInteger。valueOf(v1); BigInteger b2 = BigInteger.valueOf(v2); BigInteger res = intRangeCheck(b1。subtract(b2)); return Value(); public static int multiplyInt(int v1, int v2) throws ArithmeticException BigInteger b1 = BigInteger.valu
16、eOf(v1); BigInteger b2 = BigInteger。valueOf(v2); BigInteger res = intRangeCheck(b1。multiply(b2); return Value(); public static int divideInt(int v1, int v2) throws ArithmeticException BigInteger b1 = BigInteger。valueOf(v1); BigInteger b2 = BigInteger.valueOf(v2); BigInteger res = intRangeChec
17、k(b1。divide(b2); return Value(); 1.4.2 避免除法和取模運算分母為零要避免因為分母為零而導致除法和取模運算出現異常。if (num2 = 0) / handle error else result1= num1 /num2; result2= num1 % num2;1.5 類和方法操作1.5.1 數據成員聲明為私有,提供可訪問的包裝方法攻擊者可以用意想不到的方式操縱public或protected的數據成員,所以需要將數據成員為private,對外提供可控的包裝方法訪問數據成員。1.5.2 敏感類不允許復制包含私人的,機密或其他敏感數據的類是
18、不允許被復制的,解決的方法有兩種:1、 類聲明為finalfinal class SensitiveClass / .。2、 Clone 方法拋出CloneNotSupportedException異常class SensitiveClass / 。. public final SensitiveClass clone() throws CloneNotSupportedException throw new CloneNotSupportedException(); 1.5.3 比較類的正確做法如果由同一個類裝載器裝載,它們具有相同的完全限定名稱,則它們是兩個相同的類。不正確寫法:/ Det
19、ermine whether object auth has required/expected class object if (auth.getClass().getName().equals( ”com。application.auth。DefaultAuthenticationHandler”) / .。正確寫法:/ Determine whether object auth has required/expected class name if (auth.getClass() = com。application.auth。DefaultAuthenticationHandler。c
20、lass) / .。1.5.4 不要硬編碼敏感信息硬編碼的敏感信息,如密碼,服務器IP地址和加密密鑰,可能會泄露給攻擊者。敏感信息均必須存在在配置文件或數據庫中。1.5.5 驗證方法參數驗證方法的參數,可確保操作方法的參數產生有效的結果。不驗證方法的參數可能會導致不正確的計算,運行時異常,違反類的不變量,對象的狀態不一致。對于跨信任邊界接收參數的方法,必須進行參數合法性校驗private Object myState = null;/對于修改myState 方法的入參,進行非空和合法性校驗void setState(Object state) if (state = n
21、ull) / Handle null state if (isInvalidState(state)) / Handle invalid state myState = state;1.5.6 不要使用過時、陳舊或低效的方法在程序代碼中使用過時的、陳舊的或低效的類或方法可能會導致錯誤的行為。1.5.7 數組引用問題某個方法返回一個對敏感對象的內部數組的引用,假定該方法的調用程序不改變這些對象。即使數組對象本身
22、是不可改變的,也可以在數組對象以外操作數組的內容,這種操作將反映在返回該數組的對象中。如果該方法返回可改變的對象,外部實體可以改變在那個類中聲明的 public 變量,這種改變將反映在實際對象中。不正確的寫法:public class XXX private String xxxx;public String getXXX() return xxxx;正確的寫法:public class XXX private String xxxx;public String getXXX() String temp = Arrays。copyof(); / 或其他數組復制方法return temp;1.5
23、.8 不要產生內存泄露垃圾收集器只收集不可達的對象,因此,存在未使用的可到達的對象,仍然表示內存管理不善。過度的內存泄漏可能會導致內存耗盡,拒絕服務(DoS)。1.6 異常處理1.6.1 不要忽略捕獲的異常對于捕獲的異常要進行相應的處理,不能忽略已捕獲的異常不正確寫法:class Foo implements Runnable public void run() try Thread。sleep(1000); catch (InterruptedException e) / 此處InterruptedException被忽略 正確寫法:class Foo implements Runnable
24、 public void run() try Thread.sleep(1000); catch (InterruptedException e) Thread.currentThread().interrupt(); / Reset interrupted status 1.6.2 不允許暴露異常的敏感信息沒有過濾敏感信息的異常堆棧往往會導致信息泄漏,不正確的寫法:try FileInputStream fis = new FileInputStream(System.getenv("APPDATA”) + args0); catch (FileNotFoundException
25、e) / Log the exception throw new IOException(”Unable to retrieve file”, e);正確的寫法:class ExceptionExample public static void main(String args) File file = null; try file = new File(System。getenv("APPDATA”) + args0)。getCanonicalFile(); if (!file.getPath()。startsWith(”c:homepath") log.error(&q
26、uot;Invalid file"); return; catch (IOException x) log.error("Invalid file"); return; try FileInputStream fis = new FileInputStream(file); catch (FileNotFoundException x) log.error("Invalid file”); return; 1.6.3 不允許拋出RuntimeException, Exception,Throwable不正確的寫法:boolean isCapitalize
27、d(String s) if (s = null) throw new RuntimeException(”Null String”); private void doSomething() throws Exception /。.正確寫法:boolean isCapitalized(String s) if (s = null) throw new NullPointerException(); private void doSomething() throws IOException /.。1.6.4 不要捕獲NullPointerException或其他父類異常不正確的寫法:boolea
28、n isName(String s) try String names = s。split(” "); if (names。length != 2) return false; return (isCapitalized(names0) isCapitalized(names1)); catch (NullPointerException e) return false; 正確的寫法:boolean isName(String s) / throws NullPointerException / String names = s.split(” "); if (names。
29、length != 2) return false; return (isCapitalized(names0) && isCapitalized(names1));1.7 多線程編程1.7.1 確保共享變量的可見性對于共享變量,要確保一個線程對它的改動對其他線程是可見的。線程可能會看到一個陳舊的共享變量的值。為了共享變量是最新的,可以將變量聲明為volatile或同步讀取和寫入操作。將共享變量聲明為volatile:final class ControlledStop implements Runnable private volatile boolean done = fa
30、lse; Override public void run() while (!done) try / 。.。 Thread。currentThread()。sleep(1000); / Do something catch(InterruptedException ie) Thread.currentThread()。interrupt(); / Reset interrupted status public void shutdown() done = true; 同步讀取和寫入操作:final class ControlledStop implements Runnable privat
31、e boolean done = false; Override public void run() while (!isDone()) try / 。. Thread.currentThread()。sleep(1000); / Do something catch(InterruptedException ie) Thread。currentThread()。interrupt(); / Reset interrupted status public synchronized boolean isDone() return done; public synchronized void sh
32、utdown() done = true; 1.7.2 確保共享變量的操作是原子的除了要確保共享變量的更新對其他線程可見的,還需要確保對共享變量的操作是原子的,這時將共享變量聲明為volatile往往是不夠的。需要使用同步機制或Lock同步讀取和寫入操作:final class Flag private volatile boolean flag = true; public synchronized void toggle() flag = true; / Same as flag = !flag; public boolean getFlag() return flag; /使用讀取鎖確保
33、讀取和寫入操作的原子性final class Flag private boolean flag = true; private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final Lock readLock = lock。readLock(); private final Lock writeLock = lock.writeLock(); public void toggle() writeLock.lock(); try flag = true; / Same as flag = !flag; fi
34、nally writeLock.unlock(); public boolean getFlag() readLock。lock(); try return flag; finally readLock。unlock(); 1.7.3 不要調用Thread。run(),不要使用Thread.stop()以終止線程1.7.4 確保執行阻塞操作的線程可以終止 public final class SocketReader implements Runnable private final SocketChannel sc; private final Object lock = new Objec
35、t(); public SocketReader(String host, int port) throws IOException sc = SocketChannel。open(new InetSocketAddress(host, port)); Override public void run() ByteBuffer buf = ByteBuffer.allocate(1024); try synchronized (lock) while (!Terrupted() sc。read(buf); / 。. catch (IOException ie) / Forwa
36、rd to handler public static void main(String args) throws IOException, InterruptedException SocketReader reader = new SocketReader(”somehost", 25); Thread thread = new Thread(reader); thread。start(); Thread.sleep(1000); errupt(); 1.7.5 相互依存的任務不要在一個有限的線程池執行有限線程池指定可以同時執行在線程池中的線程數量的上限。程序
37、不得使用有限線程池線程執行相互依賴的任務。可能會導致線程饑餓死鎖,所有的線程池執行的任務正在等待一個可用的線程中執行一個內部隊列阻塞1.8 輸入輸出1.8.1 程序終止前刪除臨時文件1.8.2 檢測和處理文件相關的錯誤Java的文件操作方法往往有一個返回值,而不是拋出一個異常,表示失敗.因此,忽略返回值文件操作的程序,往往無法檢測到這些操作是否失敗。Java程序必須檢查執行文件I / O方法的返回值。不正確的寫法:File file = new File(args0);file.delete();正確的寫法:File file = new File(”file”);if (!file.dele
38、te()) log.error(”Deletion failed");1.8.3 及時釋放資源垃圾收集器無法釋放非內存資源,如打開的文件描述符與數據庫的連接.因此,不釋放資源,可能導致資源耗盡攻擊。try final FileInputStream stream = new FileInputStream(fileName); try final BufferedReader bufRead = new BufferedReader(new InputStreamReader(stream)); String line; while ((line = bufRead。readLine
39、()) != null) sendLine(line); finally if (stream != null) try stream.close(); catch (IOException e) / forward to handler catch (IOException e) / forward to handler1.9 序列化1.9.1 不要序列化未加密的敏感數據序列化允許一個對象的狀態被保存為一個字節序列,然后重新在稍后的時間恢復,它沒有提供任何機制來保護序列化的數據。敏感的數據不應該被序列化的例子包括加密密鑰,數字證書。 解決方法:1、 對于數據成員可以使用transient ,聲明該數據成員是瞬態的。2、 重寫序列化相關方法writeObject、readObject、readObjectNoData,防止被子類惡意重寫class SensitiveClass extends Number / .。. protected final Object writeObject(java。io。ObjectOutputStream out) throws NotSerializableException throw new NotSerializableExcepti
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國汽車自動收卷遮陽簾行業市場調查、投資前景及策略咨詢報告
- 2025年中國模具修補萬用膠行業投資前景及策略咨詢研究報告
- 2025年中國數模轉換器行業市場調查、投資前景及策略咨詢報告
- 2025年中國手焊治具行業市場調查、投資前景及策略咨詢報告
- 危險廢棄物溯源管理制度
- 外部供應商安全管理制度
- 學校安全五大員管理制度
- 服務合同規范管理制度
- 核酸后備人員管理制度
- 制劑實驗室設備管理制度
- API-650-1鋼制焊接石油儲罐
- 小學數學四年級(下冊)教師用書
- 醫學影像科-山東省臨床重點專科評分標準(試行)
- 重慶市沙坪壩區2021-2022學年三年級下學期期末綜合檢測語文試題(無答案)
- 籃球--傳切配合(縱切)課件.ppt
- 《消防安全培訓資料》word版
- 繪就“行走的思政課”
- 臨床技術操作規范重癥醫學分冊(共41頁)
- 《蘇東坡傳》精美(課堂PPT)
- 化學計量學基礎
- 簽約儀式背景
評論
0/150
提交評論