版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、安全編碼規(guī)范版本號:V1.0修訂頁編號章節(jié)名稱修訂內(nèi)容簡述修訂日期修訂前版本號修訂后版本號修訂人批準(zhǔn)人目 錄 TOC o 1-3 h z u HYPERLINK l _Toc334002646 1目的 PAGEREF _Toc334002646 h 5 HYPERLINK l _Toc334002647 2背景 PAGEREF _Toc334002647 h 5 HYPERLINK l _Toc334002648 3安全編碼規(guī)范 PAGEREF _Toc334002648 h 5 HYPERLINK l _Toc334002649 3.1輸入驗證和數(shù)據(jù)合法性校驗 PAGEREF _Toc334
2、002649 h 5 HYPERLINK l _Toc334002650 3.1.1避免SQL注入 PAGEREF _Toc334002650 h 5 HYPERLINK l _Toc334002651 3.1.2避免XML注入 PAGEREF _Toc334002651 h 5 HYPERLINK l _Toc334002652 3.1.3避免跨站點腳本(XSS) PAGEREF _Toc334002652 h 6 HYPERLINK l _Toc334002653 3.2聲明和初始化 PAGEREF _Toc334002653 h 6 HYPERLINK l _Toc334002654 3
3、.2.1避免類初始化的相互依賴 PAGEREF _Toc334002654 h 6 HYPERLINK l _Toc334002655 3.3表達式 PAGEREF _Toc334002655 h 7 HYPERLINK l _Toc334002656 3.3.1不可忽略方法的返回值 PAGEREF _Toc334002656 h 7 HYPERLINK l _Toc334002657 3.3.2不要引用空指針 PAGEREF _Toc334002657 h 8 HYPERLINK l _Toc334002658 3.3.3使用Arrays.equals()來比較數(shù)組的內(nèi)容 PAGEREF _
4、Toc334002658 h 8 HYPERLINK l _Toc334002659 3.4數(shù)字類型和操作 PAGEREF _Toc334002659 h 8 HYPERLINK l _Toc334002660 3.4.1防止整數(shù)溢出 PAGEREF _Toc334002660 h 8 HYPERLINK l _Toc334002661 3.4.2避免除法和取模運算分母為零 PAGEREF _Toc334002661 h 9 HYPERLINK l _Toc334002662 3.5類和方法操作 PAGEREF _Toc334002662 h 10 HYPERLINK l _Toc334002
5、663 3.5.1數(shù)據(jù)成員聲明為私有,提供可訪問的包裝方法 PAGEREF _Toc334002663 h 10 HYPERLINK l _Toc334002664 3.5.2敏感類不允許復(fù)制 PAGEREF _Toc334002664 h 10 HYPERLINK l _Toc334002665 3.5.3比較類的正確做法 PAGEREF _Toc334002665 h 10 HYPERLINK l _Toc334002666 3.5.4不要硬編碼敏感信息 PAGEREF _Toc334002666 h 11 HYPERLINK l _Toc334002667 3.5.5驗證方法參數(shù) PAG
6、EREF _Toc334002667 h 11 HYPERLINK l _Toc334002668 3.5.6不要使用過時、陳舊或低效的方法 PAGEREF _Toc334002668 h 11 HYPERLINK l _Toc334002669 3.5.7數(shù)組引用問題 PAGEREF _Toc334002669 h 11 HYPERLINK l _Toc334002670 3.5.8不要產(chǎn)生內(nèi)存泄露 PAGEREF _Toc334002670 h 12 HYPERLINK l _Toc334002671 3.6異常處理 PAGEREF _Toc334002671 h 12 HYPERLINK
7、 l _Toc334002672 3.6.1不要忽略捕獲的異常 PAGEREF _Toc334002672 h 12 HYPERLINK l _Toc334002673 3.6.2不允許暴露異常的敏感信息 PAGEREF _Toc334002673 h 13 HYPERLINK l _Toc334002674 3.6.3不允許拋出RuntimeException, Exception,Throwable PAGEREF _Toc334002674 h 14 HYPERLINK l _Toc334002675 3.6.4不要捕獲NullPointerException或其他父類異常 PAGERE
8、F _Toc334002675 h 14 HYPERLINK l _Toc334002676 3.7多線程編程 PAGEREF _Toc334002676 h 15 HYPERLINK l _Toc334002677 3.7.1確保共享變量的可見性 PAGEREF _Toc334002677 h 15 HYPERLINK l _Toc334002678 3.7.2確保共享變量的操作是原子的 PAGEREF _Toc334002678 h 16 HYPERLINK l _Toc334002679 3.7.3不要調(diào)用Thread.run(),不要使用Thread.stop()以終止線程 PAGER
9、EF _Toc334002679 h 18 HYPERLINK l _Toc334002680 3.7.4確保執(zhí)行阻塞操作的線程可以終止 PAGEREF _Toc334002680 h 18 HYPERLINK l _Toc334002681 3.7.5相互依存的任務(wù)不要在一個有限的線程池執(zhí)行 PAGEREF _Toc334002681 h 19 HYPERLINK l _Toc334002682 3.8輸入輸出 PAGEREF _Toc334002682 h 19 HYPERLINK l _Toc334002683 3.8.1程序終止前刪除臨時文件 PAGEREF _Toc334002683
10、 h 19 HYPERLINK l _Toc334002684 3.8.2檢測和處理文件相關(guān)的錯誤 PAGEREF _Toc334002684 h 19 HYPERLINK l _Toc334002685 3.8.3及時釋放資源 PAGEREF _Toc334002685 h 19 HYPERLINK l _Toc334002686 3.9序列化 PAGEREF _Toc334002686 h 20 HYPERLINK l _Toc334002687 3.9.1不要序列化未加密的敏感數(shù)據(jù) PAGEREF _Toc334002687 h 20 HYPERLINK l _Toc334002688
11、3.9.2在序列化過程中避免內(nèi)存和資源泄漏 PAGEREF _Toc334002688 h 21 HYPERLINK l _Toc334002689 3.9.3反序列化要在程序最小權(quán)限的安全環(huán)境中 PAGEREF _Toc334002689 h 22安全編碼規(guī)范輸入驗證和數(shù)據(jù)合法性校驗程序接受數(shù)據(jù)可能來源于未經(jīng)驗證的用戶,網(wǎng)絡(luò)連接和其他不受信任的來源,如果未對程序接受數(shù)據(jù)進行校驗,則可能會引發(fā)安全問題。避免SQL注入使用PreparedStatement預(yù)編譯SQL,解決SQL注入問題,傳遞給PreparedStatement對象的參數(shù)可以被強制進行類型轉(zhuǎn)換,確保在插入或查詢數(shù)據(jù)時與底層的數(shù)據(jù)
12、庫格式匹配。String sqlString = select * from db_user where username=? and password=?;PreparedStatement stmt = connection.prepareStatement(sqlString);stmt.setString(1, username);stmt.setString(2, pwd);ResultSet rs = stmt.executeQuery();避免XML注入通過StringBulider 或 StringBuffer 拼接XML文件時,需對輸入數(shù)據(jù)進行合法性校驗。對數(shù)量quantit
13、y 進行合法性校驗,控制只能傳入0-9的數(shù)字:if (!Pattern.matches(0-9+, quantity) / Format violation String xmlString = nWidgetn + 500n + + quantity + ; outStream.write(xmlString.getBytes(); outStream.flush();避免跨站點腳本(XSS)對產(chǎn)生跨站的參數(shù)進行嚴(yán)格過濾,禁止傳入標(biāo)簽/定義需過濾的字段串 String s = uFE64 + script + uFE65;/ 過濾字符串標(biāo)準(zhǔn)化s = Normalizer.normalize(
14、s, Form.NFKC);/ 使用正則表達式匹配inputStr是否存在Pattern pattern = Ppile(inputStr);Matcher matcher = pattern.matcher(s);if (matcher.find() / Found black listed tag throw new IllegalStateException(); else / .聲明和初始化避免類初始化的相互依賴?yán)哄e誤的寫法:public class Cycle private final int balance; private static final Cycle c = new
15、 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類的靜態(tài)變量c,而類Cycle的無參構(gòu)造方法又依賴靜態(tài)變量deposit
16、,導(dǎo)致無法預(yù)期的結(jié)果。正確的寫法: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 = deposit - 10; / Subtract processing
17、fee public static void main(String args) System.out.println(The account balance is: + c.balance); 表達式不可忽略方法的返回值忽略方法的放回值可能會導(dǎo)致無法預(yù)料的結(jié)果。錯誤的寫法:public void deleteFile() File someFile = new File(someFileName.txt); someFile.delete();正確的寫法:public void deleteFile() File someFile = new File(someFileName.txt);
18、if (!someFile.delete() / handle failure to delete the file 不要引用空指針當(dāng)一個變量指向一個NULL值,使用這個變量的時候又沒有檢查,這時會導(dǎo)致。NullPointerException。在使用變量前一定要做是否為NULL值的校驗。使用Arrays.equals()來比較數(shù)組的內(nèi)容數(shù)組沒有覆蓋的Object. equals()方法,調(diào)用Object. equals()方法實際上是比較數(shù)組的引用,而不是他們的內(nèi)容。程序必須使用兩個參數(shù)Arrays.equals()方法來比較兩個數(shù)組的內(nèi)容public void arrayEqualsExa
19、mple() int arr1 = new int20; / initialized to 0 int arr2 = new int20; / initialized to 0 Arrays.equals(arr1, arr2); / true數(shù)字類型和操作防止整數(shù)溢出使用 HYPERLINK mk:MSITStore:D:工作目錄API文檔java_api.CHM:/java/lang/Number.html o java.lang 中的類 java.lang.Number. BigInteger類進行整數(shù)運算,防止整數(shù)溢出。public class BigIntegerUtil priva
20、te static 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
21、 new ArithmeticException(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(int v1, int
22、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.valueOf(v1); BigInteger b
23、2 = 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 = intRangeCheck(b1.divide(b2); return Valu
24、e(); 避免除法和取模運算分母為零要避免因為分母為零而導(dǎo)致除法和取模運算出現(xiàn)異常。if (num2 = 0) / handle error else result1= num1 /num2; result2= num1 % num2;類和方法操作數(shù)據(jù)成員聲明為私有,提供可訪問的包裝方法攻擊者可以用意想不到的方式操縱public或protected的數(shù)據(jù)成員,所以需要將數(shù)據(jù)成員為private,對外提供可控的包裝方法訪問數(shù)據(jù)成員。敏感類不允許復(fù)制包含私人的,機密或其他敏感數(shù)據(jù)的類是不允許被復(fù)制的,解決的方法有兩種:類聲明為finalfinal class SensitiveClass / .C
25、lone 方法拋出CloneNotSupportedException異常class SensitiveClass / . public final SensitiveClass clone() throws CloneNotSupportedException throw new CloneNotSupportedException(); 比較類的正確做法如果由同一個類裝載器裝載,它們具有相同的完全限定名稱,則它們是兩個相同的類。不正確寫法:/ Determine whether object auth has required/expected class object if (auth.
26、getClass().getName().equals( com.application.auth.DefaultAuthenticationHandler) / .正確寫法:/ Determine whether object auth has required/expected class name if (auth.getClass() = com.application.auth.DefaultAuthenticationHandler.class) / .不要硬編碼敏感信息硬編碼的敏感信息,如密碼,服務(wù)器IP地址和加密密鑰,可能會泄露給攻擊者。敏感信息均必須存在在配置文件或數(shù)據(jù)庫中。
27、驗證方法參數(shù)驗證方法的參數(shù),可確保操作方法的參數(shù)產(chǎn)生有效的結(jié)果。不驗證方法的參數(shù)可能會導(dǎo)致不正確的計算,運行時異常,違反類的不變量,對象的狀態(tài)不一致。對于跨信任邊界接收參數(shù)的方法,必須進行參數(shù)合法性校驗private Object myState = null;/對于修改myState 方法的入?yún)?,進行非空和合法性校驗void setState(Object state) if (state = null) / Handle null stateif (isInvalidState(state) / Handle invalid statemyState = state;不要使用過時、陳舊或低
28、效的方法在程序代碼中使用過時的、陳舊的或低效的類或方法可能會導(dǎo)致錯誤的行為。數(shù)組引用問題某個方法返回一個對敏感對象的內(nèi)部數(shù)組的引用,假定該方法的調(diào)用程序不改變這些對象。即使數(shù)組對象本身是不可改變的,也可以在數(shù)組對象以外操作數(shù)組的內(nèi)容,這種操作將反映在返回該數(shù)組的對象中。如果該方法返回可改變的對象,外部實體可以改變在那個類中聲明的 public 變量,這種改變將反映在實際對象中。不正確的寫法:public class XXX private String xxxx;public String getXXX() return xxxx;正確的寫法:public class XXX private
29、String xxxx;public String getXXX() String temp = Arrays.copyof(); / 或其他數(shù)組復(fù)制方法return temp;不要產(chǎn)生內(nèi)存泄露垃圾收集器只收集不可達的對象,因此,存在未使用的可到達的對象,仍然表示內(nèi)存管理不善。過度的內(nèi)存泄漏可能會導(dǎo)致內(nèi)存耗盡,拒絕服務(wù)(DoS)。異常處理不要忽略捕獲的異常對于捕獲的異常要進行相應(yīng)的處理,不能忽略已捕獲的異常不正確寫法:class Foo implements Runnable public void run() try Thread.sleep(1000); catch (Interrupte
30、dException e) / 此處InterruptedException被忽略 正確寫法:class Foo implements Runnable public void run() try Thread.sleep(1000); catch (InterruptedException e) Thread.currentThread().interrupt(); / Reset interrupted status 不允許暴露異常的敏感信息沒有過濾敏感信息的異常堆棧往往會導(dǎo)致信息泄漏,不正確的寫法:try FileInputStream fis = new FileInputStream
31、(System.getenv(APPDATA) + args0); catch (FileNotFoundException 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 (!fil
32、e.getPath().startsWith(c:homepath) log.error(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; 不允許拋出RuntimeException, Exception,Throwable不正確的寫法:boolean is
33、Capitalized(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 /.不要捕獲NullPointerException或其他父類異常不正確的寫法:boolea
34、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.length != 2
35、) return false; return (isCapitalized(names0) & isCapitalized(names1);多線程編程確保共享變量的可見性對于共享變量,要確保一個線程對它的改動對其他線程是可見的。線程可能會看到一個陳舊的共享變量的值。為了共享變量是最新的,可以將變量聲明為volatile或同步讀取和寫入操作。將共享變量聲明為volatile:final class ControlledStop implements Runnable private volatile boolean done = false; Override public void run()
36、 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 private boolean done = false; Override
37、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 shutdown() done = true; 確保共享變量的操作是原子的
38、除了要確保共享變量的更新對其他線程可見的,還需要確保對共享變量的操作是原子的,這時將共享變量聲明為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; /使用讀取鎖確保讀取和寫入操作的原子性final class Flag private boole
39、an 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; finally writeLock.unlock(); public boolean
40、getFlag() readLock.lock(); try return flag; finally readLock.unlock(); 不要調(diào)用Thread.run(),不要使用Thread.stop()以終止線程確保執(zhí)行阻塞操作的線程可以終止 public final class SocketReader implements Runnable private final SocketChannel sc; private final Object lock = new Object(); public SocketReader(String host, int port) throw
41、s 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) / Forward to handler public static void main(String args) throws IOExce
42、ption, InterruptedException SocketReader reader = new SocketReader(somehost, 25); Thread thread = new Thread(reader); thread.start(); Thread.sleep(1000); errupt(); 相互依存的任務(wù)不要在一個有限的線程池執(zhí)行有限線程池指定可以同時執(zhí)行在線程池中的線程數(shù)量的上限。程序不得使用有限線程池線程執(zhí)行相互依賴的任務(wù)??赡軙?dǎo)致線程饑餓死鎖,所有的線程池執(zhí)行的任務(wù)正在等待一個可用的線程中執(zhí)行一個內(nèi)部隊列阻塞輸入輸出程序終止前刪除臨時文件檢測和處理文
43、件相關(guān)的錯誤Java的文件操作方法往往有一個返回值,而不是拋出一個異常,表示失敗。因此,忽略返回值文件操作的程序,往往無法檢測到這些操作是否失敗。Java程序必須檢查執(zhí)行文件I / O方法的返回值。不正確的寫法:File file = new File(args0);file.delete();正確的寫法:File file = new File(file);if (!file.delete() log.error(Deletion failed);及時釋放資源垃圾收集器無法釋放非內(nèi)存資源,如打開的文件描述符與數(shù)據(jù)庫的連接。因此,不釋放資源,可能導(dǎo)致資源耗盡攻擊。try final FileI
44、nputStream stream = new FileInputStream(fileName); try final BufferedReader bufRead = new BufferedReader(new InputStreamReader(stream); String line; while (line = bufRead.readLine() != null) sendLine(line); finally if (stream != null) try stream.close(); catch (IOException e) / forward to handler catch (IOException e) / forward to handler序列化不要序列化未加密的敏感數(shù)據(jù)序列化允許一個對象的狀態(tài)被保存為一個字節(jié)序列,然后重新在稍后的時間恢復(fù),它沒有提供任何機制來保護序列化的數(shù)據(jù)。敏感的數(shù)據(jù)不應(yīng)該被序列化的例子包括加密密鑰,數(shù)字證書。 解決方法:對于數(shù)據(jù)成員可以使用transient ,聲明該數(shù)據(jù)成員是瞬態(tài)的。重寫序列化相關(guān)方法writeObject、readObje
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年健身活動時間協(xié)議
- 2025年健身社交平臺服務(wù)協(xié)議
- 2025年保密協(xié)議章程規(guī)范規(guī)則
- 2025年度路燈照明設(shè)備采購、安裝與維護合同4篇
- 2025年在線醫(yī)學(xué)診療咨詢合同
- 2025年品酒店連鎖加盟合同
- 2025年分銷代理合作示范協(xié)議
- 2025年合資協(xié)議格式范本
- 2025年度可再生能源發(fā)電項目并網(wǎng)協(xié)議書4篇
- 2025版媒體內(nèi)容版權(quán)授權(quán)與收益分成合同4篇
- 2024版?zhèn)€人私有房屋購買合同
- 2025年山東光明電力服務(wù)公司招聘筆試參考題庫含答案解析
- 《神經(jīng)發(fā)展障礙 兒童社交溝通障礙康復(fù)規(guī)范》
- 2025年中建六局二級子企業(yè)總經(jīng)理崗位公開招聘高頻重點提升(共500題)附帶答案詳解
- 2024年5月江蘇省事業(yè)單位招聘考試【綜合知識與能力素質(zhì)】真題及答案解析(管理類和其他類)
- 注漿工安全技術(shù)措施
- 2024年世界職業(yè)院校技能大賽“食品安全與質(zhì)量檢測組”參考試題庫(含答案)
- 3-9年級信息技術(shù)(人教版、清華版)教科書資源下載
- 上海牛津版三年級英語3B期末試卷及答案(共5頁)
- 行為疼痛量表BPS
- 小學(xué)生必背古詩詞80首(硬筆書法田字格)
評論
0/150
提交評論