




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、安全編碼規(guī)范版本號:V1.0修訂頁編 號早節(jié) 名稱修訂內(nèi)容簡述修訂日期修訂前 版本號修訂后版本號修訂人批準(zhǔn)人目錄1 目的 錯 誤!未定義書簽。2 背景 錯 誤!未定義書簽。3 安全編碼規(guī)范 53.1 輸入驗證和數(shù)據(jù)合法性校驗 53.1.1 避免SQL注入53.1.2 避免XML注入53.1.3 避免跨站點腳本( XSS) 53.2 聲明和初始化 63.2.1 避免類初始化的相互依賴 63.3 表達式 73.3.1 不可忽略方法的返回值 73.3.2 不要引用空指針 73.3.3 使用Arrays.equals ()來比較數(shù)組的內(nèi)容 83.4 數(shù)字類型和操作 83.4.1 防止整數(shù)溢出 83.4
2、.2 避免除法和取模運算分母為零 93.5 類和方法操作 93.5.1 數(shù)據(jù)成員聲明為私有,提供可訪問的包裝方法 93.5.2 敏感類不允許復(fù)制 93.5.3 比較類的正確做法 103.5.4 不要硬編碼敏感信息 103.5.5 驗證方法參數(shù) 103.5.6 不要使用過時、陳舊或低效的方法 113.5.7 數(shù)組引用問題 113.5.8 不要產(chǎn)生內(nèi)存泄露 113.6 異常處理 123.6.1 不要忽略捕獲的異常 123.6.2 不允許暴露異常的敏感信息 123.6.3 不允許拋出 RuntimeException, Exception,Throwable 133.6.4 不要捕獲 NullPoi
3、nterException 或其他父類異常 143.7 多線程編程 153.7.1 確保共享變量的可見性 153.7.2 確保共享變量的操作是原子的 163.7.3 不要調(diào)用Thread.run (),不要使用Thread.stop ()以終止線程 173.7.4 確保執(zhí)行阻塞操作的線程可以終止 173.7.5 相互依存的任務(wù)不要在一個有限的線程池執(zhí)行 183.8 輸入輸出 183.8.1 程序終止前刪除臨時文件 183.8.2 檢測和處理文件相關(guān)的錯誤 183.8.3 及時釋放資源 193.9 序列化 203.9.1不要序列化未加密的敏感數(shù)據(jù) 203.9.2 在序列化過程中避免內(nèi)存和資源泄漏
4、 203.9.3 反序列化要在程序最小權(quán)限的安全環(huán)境中 221安全編碼規(guī)范1.1輸入驗證和數(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ù)庫格式匹配。String sqlStri ng = select * from db_user where user name=? and password=?;Prepared
5、Stateme nt stmt = connection. prepareStateme nt(sqlStri ng);stmt.setStri ng(1, user name);stmt.setStri ng(2, pwd);ResultSet rs = stmt.executeQuery();避免XML注入通過StringBulider或StringBuffer拼接XML文件時,需對輸入數(shù)據(jù)進行合法性校驗。對數(shù)量quantity進行合法性校驗,控制只能傳入 0-9的數(shù)字:if (!Pattern.matches(0-9+, quantity) / Format violati onStri
6、ng xmlString = nWidgetv/descriptionn +500n + + qua ntity + ;outStream.write(xmlStri ng.getBytes();outStream.flush();避免跨站點腳本(XSS)對產(chǎn)生跨站的參數(shù)進行嚴格過濾,禁止傳入標(biāo)簽/定義需過濾的字段串String s = uFE64 + script + uFE65;/過濾字符串標(biāo)準(zhǔn)化s = Normalizer. no rmalize(s, Form.NFKC);/ 使用正則表達式匹配inputStr是否存在Pattern patter n = Patter n. compi
7、le(i nputStr);Matcher matcher = patter n. matcher(s);if (matcher.find() / Found black listed tag|throw new IllegalStateExceptio n(); else / .1.2聲明和初始化1.2.1避免類初始化的相互依賴例:錯誤的寫法:public class Cycle private final int balanee;private static final Cycle c = new Cycle();private static final int deposit = (in
8、t) (Math.ra ndom() * 100); / Ran dom depositpublic Cycle() bala nee = deposit - 10; / Subtract process ing feepublic static void main(String args) System.out.println(The account balance is: + c.balanee);類加載時初始化指向Cycle類的靜態(tài)變量c,而類Cycle的無參構(gòu)造方法又依賴靜態(tài)變量deposit,導(dǎo)致無法預(yù)期的結(jié)果。正確的寫法:public class Cycle private fin
9、al int balance;private static final int deposit = (int) (Math.random() * 100); / Random depositprivate static final Cycle c = new Cycle(); / Inserted after initialization of required fields public Cycle() balance = deposit - 10; / Subtract processing feepublic static void main(String args) System.ou
10、t.println(The account balance is: + c.balance);1.3 表達式1.3.1 不可忽略方法的返回值忽略方法的放回值可能會導(dǎo)致無法預(yù)料的結(jié)果。錯誤的寫法:public void deleteFile()File someFile = new File(someFileName.txt);someFile.delete();正確的寫法:public void deleteFile()File someFile = new File(someFileName.txt);if (!someFile.delete() / handle failure to de
11、lete the file1.3.2 不要引用空指針當(dāng)一個變量指向一個 NULL 值,使用這個變量的時候又沒有檢查,這時會導(dǎo)致 。NullPointerException。在使用變量前一定要做是否為NULL值的校驗。return Value();1.3.3 使用 Arrays.equals ()來比較數(shù)組的內(nèi)容數(shù)組沒有覆蓋的 Object. equals() 方法,調(diào)用 Object. equals() 方法實際上是比較數(shù)組的引 用,而不是他們的內(nèi)容。程序必須使用兩個參數(shù)Arrays.equals ()方法來比較兩個數(shù)組的內(nèi)容public void arrayEqualsExam
12、ple() int arr1 = new int20; / initialized to 0int arr2 = new int20; / initialized to 0Arrays.equals(arr1, arr2); / true1.4 數(shù)字類型和操作1.4.1 防止整數(shù)溢出使用java.lang.Number. Biglnteger類進行整數(shù)運算,防止整數(shù)溢出。public class BigIntegerUtil privatestaticfinal BiglntegerbigMaxlnt =Biglnteger.valueOf(lnteger. MAX_VALUE);privat
13、estaticfinal Biglnteger bigMinlnt =Biglnteger.valueOf(lnteger. MlN_VALUE );publicstaticBiglnteger intRangeCheck(Biglnteger val)ArithmeticException throwsif (pareTo( bigMaxlnt ) = 1 | pareTo(bigMinlnt ) = -1) throw new ArithmeticException( lnteger overflow );return val;public staticint addlnt(int v1,
14、int v2) throws ArithmeticException Biglnteger b1 = Biglnteger.Biglnteger b2 = Biglnteger.valueOf (v1);valueOf (v2);Biglnteger res =intRangeCheck (b1.add(b2);return Value();public static int sublnt( Biglnteger b1 = Biglnteger. Biglnteger b2 = B v1, int v2) throws ArithmeticExcepti
15、on valueOf (v1);valueOf (v2);public static int multiplyInt(int v1, int v2) throws ArithmeticException BigInteger b1 = BigInteger.valueOf (v1);BigInteger b2 = BigInteger.valueOf (v2);BigInteger res =intRangeCheck (b1.multiply(b2);return Value();public static int divideInt(int v1, int v2) throw
16、s ArithmeticException BigInteger b1 = BigInteger.valueOf (v1);BigInteger b2 = BigInteger.valueOf (v2);BigInteger res =intRangeCheck (b1.divide(b2);return Value();1.4.2 避免除法和取模運算分母為零 要避免因為分母為零而導(dǎo)致除法和取模運算出現(xiàn)異常。 if (num2 = 0) / handle error else result1= num1 /num2;result2= num1 % num2;1.5 類和方法操作1
17、.5.1 數(shù)據(jù)成員聲明為私有,提供可訪問的包裝方法攻擊者可以用意想不到的方式操縱 public 或 protected 的數(shù)據(jù)成員,所以需要將數(shù)據(jù)成 員為 private ,對外提供可控的包裝方法訪問數(shù)據(jù)成員。1.5.2 敏感類不允許復(fù)制 包含私人的,機密或其他敏感數(shù)據(jù)的類是不允許被復(fù)制的,解決的方法有兩種: 1、 類聲明為 finalfinal class SensitiveClass / .2、Clone 方法拋出 CloneNotSupportedException異常class Sen sitiveClass / .public final Sen sitiveClass cion e
18、() throws Cion eNotSupportedExcepti on throw new Cion eNotSupportedExcepti on();比較類的正確做法如果由同一個類裝載器裝載,它們具有相同的完全限定名稱,則它們是兩個相同的類。不正確寫法:/ Determ ine whether object auth has required/expected class objectif (auth.getClass().getName().equals(com.applicatio n.auth.DefaultAuthe nticatio nHan dler) / .正確寫法:/
19、 Determ ine whether object auth has required/expected class n ameif (auth.getClass() = com.applicatio n. auth.DefaultAuthe nticati onHan dler.class) / .不要硬編碼敏感信息硬編碼的敏感信息,如密碼,服務(wù)器IP地址和加密密鑰,可能會泄露給攻擊者。敏感信息均必須存在在配置文件或數(shù)據(jù)庫中。驗證方法參數(shù)驗證方法的參數(shù),可確保操作方法的參數(shù)產(chǎn)生有效的結(jié)果。不驗證方法的參數(shù)可能會導(dǎo)致不正確的計算,運行時異常,違反類的不變量,對象的狀態(tài)不一致。對于跨信任邊界接
20、收參數(shù)的方法,必須進行參數(shù)合法性校驗private Object myState = n ull;/對于修改myState方法的入?yún)?,進行非空和合法性校驗void setState(Object state) if (state = n ull) / Han die null stateif (isl nvalidState(state) / Han die in valid statemyState = state;不要使用過時、陳舊或低效的方法在程序代碼中使用過時的、陳舊的或低效的類或方法可能會導(dǎo)致錯誤的行為。數(shù)組引用問題某個方法返回一個對敏感對象的內(nèi)部數(shù)組的引用,假定該方法的調(diào)用程序不改
21、變這些對象。即使數(shù)組對象本身是不可改變的,也可以在數(shù)組對象以外操作數(shù)組的內(nèi)容,這種操作將反映在返回該數(shù)組的對象中。如果該方法返回可改變的對象,外部實體可以改變在那個類中聲明的public變量,這種改變將反映在實際對象中。不正確的寫法:public class XXX private Strin g xxxx;public Stri ng getXXX() return xxxx;正確的寫法:public class XXX private Strin g xxxx;public Stri ng getXXX() String temp = Arrays.copyof();/ 或其他數(shù)組復(fù)制方法
22、return temp;不要產(chǎn)生內(nèi)存泄露垃圾收集器只收集不可達的對象,因此,存在未使用的可到達的對象,仍然表示內(nèi)存管理不善。過度的內(nèi)存泄漏可能會導(dǎo)致內(nèi)存耗盡,拒絕服務(wù)(DoS)。1.6異常處理不要忽略捕獲的異常對于捕獲的異常要進行相應(yīng)的處理,不能忽略已捕獲的異常不正確寫法:class Foo impleme nts Runn able public void run() try Thread.sleep(1000); catch (In terruptedExcepti on e) / 此處 InterruptedException 被忽略正確寫法:class Foo impleme nts
23、Runn able public void run() try Thread.sleep(1000); catch (In terruptedExcepti on e) Thread.curre ntThread().i nterrupt(); / Reset in terrupted status不允許暴露異常的敏感信息沒有過濾敏感信息的異常堆棧往往會導(dǎo)致信息泄漏,不正確的寫法:try FileI nputStream fis =new FileInputStream(System.getenv(APPDATA) + args0); catch (FileNotF oun dExceptio
24、 n e) / Log the excepti onthrow 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(Invalid file);ret
25、urn; 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 isCapitalized(String s) if (s = null) throw new RuntimeException(Nu
26、ll String);private void doSomething() throws Exception /.正確寫法:boolean isCapitalized(String s) if (s = null) throw new NullPointerException();private void doSomething() throws IOException /.不要捕獲 NullPointerException 或其他父類異常不正確的寫法:boolean isName(String s) try String names = s.split( );if (names.length
27、 != 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) return false;return (isCapitalized(names0) & isCapitalized(names1);
28、1.7 多線程編程1.7.1 確保共享變量的可見性 對于共享變量,要確保一個線程對它的改動對其他線程是可見的??梢詫⒆兞柯暶鳛榫€程可能會看到一個陳舊的共享變量的值。 為了共享變量是最新的, volatile 或同步讀取和寫入操作。將共享變量聲明為 volatile :final class ControlledStop implements Runnable private volatile boolean done = false;Override public void run() while (!done) try / .Thread.currentThread().sleep(1000
29、); / Do something catch(InterruptedException ie) Thread.currentThread().interrupt(); / Reset interrupted statuspublic void shutdown() done = true; 同步讀取和寫入操作: final class ControlledStop implements Runnable private boolean done = false;Override public void run() while (!isDone() try / .Thread.currentT
30、hread().sleep(1000); / Do something catch(InterruptedException ie) Thread.currentThread().interrupt(); / Reset interrupted statuspublic synchronized boolean isDone() return done;public synchronized void shutdown() done = true;確保共享變量的操作是原子的 除了要確保共享變量的更新對其他線程可見的, 還需要確保對共享變量的操作是原子的, 這時將共享變量聲明為 volatile
31、 往往是不夠的。需要使用同步機制或 Lock 同步讀取和寫入操作:final class Flag private volatile boolean flag = true;public synchronized void toggle() flag A= true; / Same as flag = !flag;public boolean getFlag() return flag;/使用讀取鎖確保讀取和寫入操作的原子性final class Flag private boolean flag = true;private final ReadWriteLock lock = new Re
32、entrantReadWriteLock();private final Lock readLock = lock.readLock();private final Lock writeLock = lock.writeLock(); public void toggle() writeLock.lock();try flag A= true; / Same as flag = !flag; finally writeLock.unlock(); public boolean getFlag() readLock.lock();try return flag; finally readLock
33、.unlock();1.7.3 不要調(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) throws IOException sc = SocketChannel.open(new InetSocketAd
34、dress(host, port);Override public void run() ByteBuffer buf = ByteBuffer.allocate(1024);try synchronized (lock) while (!Terrupted() sc.read(buf);/ . catch (IOException ie) / Forward to handlerpublic static void main(String args)throws IOException, InterruptedException SocketReader reader =
35、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)部隊列阻塞1.8 輸入輸出1.8.1 程序終止前刪除臨時文件1.8.2 檢測和處理文件相關(guān)的錯誤Java的文件操作方法往往有一
36、個返回值,而不是拋出一個異常,表示失敗。因此,忽略 返回值文件操作的程序,往往無法檢測到這些操作是否失敗。Java程序必須檢查執(zhí)行文件 I / O 方法的返回值。不正確的寫法:File file = new File(args0); file.delete(); 正確的寫法:File file = new File(file);if (!file.delete() log.error(Deletion failed);1.8.3 及時釋放資源垃圾收集器無法釋放非內(nèi)存資源, 如打開的文件描述符與數(shù)據(jù)庫的連接。 因此, 不釋放 資源,可能導(dǎo)致資源耗盡攻擊。try final FileInputSt
37、ream 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 (IOExc
38、eption e) / forward to handler1.9序列化1.9.1不要序列化未加密的敏感數(shù)據(jù)序列化允許一個對象的狀態(tài)被保存為一個字節(jié)序列,然后重新在稍后的時間恢復(fù),它沒有提供任何機制來保護序列化的數(shù)據(jù)。敏感的數(shù)據(jù)不應(yīng)該被序列化的例子包括加密密鑰,數(shù)字證書。解決方法:1、 對于數(shù)據(jù)成員可以使用transient,聲明該數(shù)據(jù)成員是瞬態(tài)的。2、 重寫序列化相關(guān)方法writeObject、readObject 、readObjectNoData,防止被子類惡意重寫class Sen sitiveClass exte nds Number / .protected final Object writeObject(java.io.ObjectOutputStreamout) throwsNotSerializableException throw new NotSerializableExceptio n();pro
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建對外經(jīng)濟貿(mào)易職業(yè)技術(shù)學(xué)院《藥物生物技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 《大戰(zhàn)中的插曲》教學(xué)設(shè)計 2023-2024學(xué)年統(tǒng)編版高中語文選擇性必修上冊
- 海南熱帶海洋學(xué)院《男裝設(shè)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東政法學(xué)院《數(shù)字集成電路設(shè)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 太原幼兒師范高等專科學(xué)?!陡呒壒芾斫y(tǒng)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 皖江工學(xué)院《專業(yè)技能訓(xùn)練化學(xué)教學(xué)技能與訓(xùn)練》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄭州體育職業(yè)學(xué)院《室內(nèi)空間設(shè)計公共》2023-2024學(xué)年第二學(xué)期期末試卷
- 吉林體育學(xué)院《生物工程專業(yè)分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 河南2025年河南職業(yè)技術(shù)學(xué)院招聘30人筆試歷年參考題庫附帶答案詳解
- 免燒磚銷售合同范本
- 人教版(2025版)七年級下冊英語UNIT 1 Animal Friends 單元整體教學(xué)設(shè)計(6個課時)
- 項目管理知識手冊指南
- 2025年常熟市招聘進村人員歷年高頻重點提升(共500題)附帶答案詳解
- (主城一診)重慶市2025年高2025屆高三學(xué)業(yè)質(zhì)量調(diào)研抽測 (第一次)物理試卷(含答案)
- 2025年中國電信集團有限公司招聘筆試參考題庫含答案解析
- DB50T 393-2011 城市三維建模技術(shù)規(guī)范
- 《肺癌圍手術(shù)期護理》課件
- 《糖尿病足護理查房》課件
- 山東省臨沂市地圖矢量課件模板()
- 2024復(fù)工復(fù)產(chǎn)安全培訓(xùn)
評論
0/150
提交評論