![安全編碼規(guī)范_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/16/00078c87-a1fc-4762-a88f-076913691a9e/00078c87-a1fc-4762-a88f-076913691a9e1.gif)
![安全編碼規(guī)范_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/16/00078c87-a1fc-4762-a88f-076913691a9e/00078c87-a1fc-4762-a88f-076913691a9e2.gif)
![安全編碼規(guī)范_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/16/00078c87-a1fc-4762-a88f-076913691a9e/00078c87-a1fc-4762-a88f-076913691a9e3.gif)
![安全編碼規(guī)范_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/16/00078c87-a1fc-4762-a88f-076913691a9e/00078c87-a1fc-4762-a88f-076913691a9e4.gif)
![安全編碼規(guī)范_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/16/00078c87-a1fc-4762-a88f-076913691a9e/00078c87-a1fc-4762-a88f-076913691a9e5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、.安全編碼規(guī)范版本號:V1.0修訂頁編號章節(jié)名稱修訂內(nèi)容簡述修訂日期修訂前版本號修訂后版本號修訂人批準(zhǔn)人目 錄1目的52背景53安全編碼規(guī)范53.1輸入驗(yàn)證和數(shù)據(jù)合法性校驗(yàn)53.1.1避免SQL注入53.1.2避免XML注入53.1.3避免跨站點(diǎn)腳本(XSS)63.2聲明和初始化63.2.1避免類初始化的相互依賴63.3表達(dá)式73.3.1不可忽略方法的返回值73.3.2不要引用空指針83.3.3使用Arrays.equals()來比較數(shù)組的內(nèi)容83.4數(shù)字類型和操作83.4.1防止整數(shù)溢出83.4.2避免除法和取模運(yùn)算分母為零93.5類和方法操作103.5.1數(shù)據(jù)成員聲明為私有,提供可訪問的包
2、裝方法103.5.2敏感類不允許復(fù)制103.5.3比較類的正確做法103.5.4不要硬編碼敏感信息113.5.5驗(yàn)證方法參數(shù)113.5.6不要使用過時(shí)、陳舊或低效的方法113.5.7數(shù)組引用問題113.5.8不要產(chǎn)生內(nèi)存泄露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不要調(diào)
3、用Thread.run(),不要使用Thread.stop()以終止線程183.7.4確保執(zhí)行阻塞操作的線程可以終止183.7.5相互依存的任務(wù)不要在一個(gè)有限的線程池執(zhí)行193.8輸入輸出193.8.1程序終止前刪除臨時(shí)文件193.8.2檢測和處理文件相關(guān)的錯(cuò)誤193.8.3及時(shí)釋放資源193.9序列化203.9.1不要序列化未加密的敏感數(shù)據(jù)203.9.2在序列化過程中避免內(nèi)存和資源泄漏213.9.3反序列化要在程序最小權(quán)限的安全環(huán)境中221 安全編碼規(guī)范1.1 輸入驗(yàn)證和數(shù)據(jù)合法性校驗(yàn)程序接受數(shù)據(jù)可能來源于未經(jīng)驗(yàn)證的用戶,網(wǎng)絡(luò)連接和其他不受信任的來源,如果未對程序接受數(shù)據(jù)進(jìn)行校驗(yàn),則可能會引
4、發(fā)安全問題。1.1.1 避免SQL注入使用PreparedStatement預(yù)編譯SQL,解決SQL注入問題,傳遞給PreparedStatement對象的參數(shù)可以被強(qiáng)制進(jìn)行類型轉(zhuǎn)換,確保在插入或查詢數(shù)據(jù)時(shí)與底層的數(shù)據(jù)庫格式匹配。 String sqlString = "select * from db_user where username=? and password=?"PreparedStatement stmt = connection.prepareStatement(sqlString);stmt.setString(1, username);stm
5、t.setString(2, pwd);ResultSet rs = stmt.executeQuery();1.1.2 避免XML注入通過StringBulider 或 StringBuffer 拼接XML文件時(shí),需對輸入數(shù)據(jù)進(jìn)行合法性校驗(yàn)。對數(shù)量quantity 進(jìn)行合法性校驗(yàn),控制只能傳入0-9的數(shù)字:if (!Pattern.matches("0-9+", quantity) / Format violation String xmlString = "<item>n<description>Widget</descripti
6、on>n" + "<price>500</price>n" + "<quantity>" + quantity + "</quantity></item>" outStream.write(xmlString.getBytes(); outStream.flush();1.1.3 避免跨站點(diǎn)腳本(XSS)對產(chǎn)生跨站的參數(shù)進(jìn)行嚴(yán)格過濾,禁止傳入<SCRIPT>標(biāo)簽/定義需過濾的字段串 <script>String s = "uF
7、E64" + "script" + "uFE65"/ 過濾字符串標(biāo)準(zhǔn)化s = Normalizer.normalize(s, Form.NFKC);/ 使用正則表達(dá)式匹配inputStr是否存在<script>Pattern pattern = Ppile(inputStr);Matcher matcher = pattern.matcher(s);if (matcher.find() / Found black listed tag throw new IllegalStateException(); else / .1.2 聲明
8、和初始化1.2.1 避免類初始化的相互依賴?yán)哄e(cuò)誤的寫法:public class Cycle private final int balance; private static 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
9、) System.out.println("The account balance is: " + c.balance); 類加載時(shí)初始化指向Cycle類的靜態(tài)變量c,而類Cycle的無參構(gòu)造方法又依賴靜態(tài)變量deposit,導(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
10、 Cycle(); / Inserted after initialization of required fields public Cycle() balance = deposit - 10; / Subtract processing fee public static void main(String args) System.out.println("The account balance is: " + c.balance); 1.3 表達(dá)式1.3.1 不可忽略方法的返回值忽略方法的放回值可能會導(dǎo)致無法預(yù)料的結(jié)果。錯(cuò)誤的寫法:public void delet
11、eFile() File someFile = new File("someFileName.txt"); someFile.delete();正確的寫法:public void deleteFile() File someFile = new File("someFileName.txt"); if (!someFile.delete() / handle failure to delete the file 1.3.2 不要引用空指針當(dāng)一個(gè)變量指向一個(gè)NULL值,使用這個(gè)變量的時(shí)候又沒有檢查,這時(shí)會導(dǎo)致。NullPointerException。在使
12、用變量前一定要做是否為NULL值的校驗(yàn)。1.3.3 使用Arrays.equals()來比較數(shù)組的內(nèi)容數(shù)組沒有覆蓋的Object. equals()方法,調(diào)用Object. equals()方法實(shí)際上是比較數(shù)組的引用,而不是他們的內(nèi)容。程序必須使用兩個(gè)參數(shù)Arrays.equals()方法來比較兩個(gè)數(shù)組的內(nèi)容public void arrayEqualsExample() int arr1 = new int20; / initialized to 0 int arr2 = new int20; / initialized to 0 Arrays.equals(arr1, arr2); / t
13、rue1.4 數(shù)字類型和操作1.4.1 防止整數(shù)溢出使用java.lang.Number. BigInteger類進(jìn)行整數(shù)運(yùn)算,防止整數(shù)溢出。public class BigIntegerUtil private static final BigInteger bigMaxInt = BigInteger.valueOf(Integer.MAX_VALUE); private static final BigInteger bigMinInt = BigInteger.valueOf(Integer.MIN_VALUE); public static BigInteger intRangeCh
14、eck(BigInteger val) throws ArithmeticException if (pareTo(bigMaxInt) = 1 | pareTo(bigMinInt) = -1) throw new ArithmeticException("Integer overflow"); return val; public static int addInt(int v1, int v2) throws ArithmeticException BigInteger b1 = BigInteger.valueOf(v1); BigInteger b2 = BigI
15、nteger.valueOf(v2); BigInteger res = intRangeCheck(b1.add(b2); return Value(); public static int subInt(int v1, int v2) throws ArithmeticException BigInteger b1 = BigInteger.valueOf(v1); BigInteger b2 = BigInteger.valueOf(v2); BigInteger res = intRangeCheck(b1.subtract(b2); return Valu
16、e(); 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) throws ArithmeticException
17、BigInteger b1 = BigInteger.valueOf(v1); BigInteger b2 = BigInteger.valueOf(v2); BigInteger res = intRangeCheck(b1.divide(b2); return Value(); 1.4.2 避免除法和取模運(yùn)算分母為零要避免因?yàn)榉帜笧榱愣鴮?dǎo)致除法和取模運(yùn)算出現(xiàn)異常。if (num2 = 0) / handle error else result1= num1 /num2; result2= num1 % num2;1.5 類和方法操作1.5.1 數(shù)據(jù)成員聲明為私有,提供可訪問的
18、包裝方法攻擊者可以用意想不到的方式操縱public或protected的數(shù)據(jù)成員,所以需要將數(shù)據(jù)成員為private,對外提供可控的包裝方法訪問數(shù)據(jù)成員。1.5.2 敏感類不允許復(fù)制包含私人的,機(jī)密或其他敏感數(shù)據(jù)的類是不允許被復(fù)制的,解決的方法有兩種:1、 類聲明為finalfinal class SensitiveClass / .2、 Clone 方法拋出CloneNotSupportedException異常class SensitiveClass / . public final SensitiveClass clone() throws CloneNotSupportedExcept
19、ion throw new CloneNotSupportedException(); 1.5.3 比較類的正確做法如果由同一個(gè)類裝載器裝載,它們具有相同的完全限定名稱,則它們是兩個(gè)相同的類。不正確寫法:/ Determine whether object auth has required/expected class object if (auth.getClass().getName().equals( "com.application.auth.DefaultAuthenticationHandler") / .正確寫法:/ Determine whether ob
20、ject auth has required/expected class name if (auth.getClass() = com.application.auth.DefaultAuthenticationHandler.class) / .1.5.4 不要硬編碼敏感信息硬編碼的敏感信息,如密碼,服務(wù)器IP地址和加密密鑰,可能會泄露給攻擊者。敏感信息均必須存在在配置文件或數(shù)據(jù)庫中。1.5.5 驗(yàn)證方法參數(shù)驗(yàn)證方法的參數(shù),可確保操作方法的參數(shù)產(chǎn)生有效的結(jié)果。不驗(yàn)證方法的參數(shù)可能會導(dǎo)致不正確的計(jì)算,運(yùn)行時(shí)異常,違反類的不變量,對象的狀態(tài)不一致。對于跨信任邊界接收參數(shù)的方法,必須進(jìn)行參數(shù)合法
21、性校驗(yàn)private Object myState = null;/對于修改myState 方法的入?yún)?,進(jìn)行非空和合法性校驗(yàn)void setState(Object state) if (state = null) / Handle null state if (isInvalidState(state) / Handle invalid state myState = state;1
22、.5.6 不要使用過時(shí)、陳舊或低效的方法在程序代碼中使用過時(shí)的、陳舊的或低效的類或方法可能會導(dǎo)致錯(cuò)誤的行為。1.5.7 數(shù)組引用問題某個(gè)方法返回一個(gè)對敏感對象的內(nèi)部數(shù)組的引用,假定該方法的調(diào)用程序不改變這些對象。即使數(shù)組對象本身是不可改變的,也可以在數(shù)組對象以外操作數(shù)組的內(nèi)容,這種操作將反映在返回該數(shù)組的對象中。如果該方法返回可改變的對象,外部實(shí)體可以改變在那個(gè)類中聲明的 public 變量,這種改變將反映在實(shí)際對象中。不正確的寫法:public class XXX private String xxxx;public String getXXX() return xxxx;正確的寫法:pub
23、lic class XXX private String xxxx;public String getXXX() String temp = Arrays.copyof(); / 或其他數(shù)組復(fù)制方法return temp;1.5.8 不要產(chǎn)生內(nèi)存泄露垃圾收集器只收集不可達(dá)的對象,因此,存在未使用的可到達(dá)的對象,仍然表示內(nèi)存管理不善。過度的內(nèi)存泄漏可能會導(dǎo)致內(nèi)存耗盡,拒絕服務(wù)(DoS)。1.6 異常處理1.6.1 不要忽略捕獲的異常對于捕獲的異常要進(jìn)行相應(yīng)的處理,不能忽略已捕獲的異常不正確寫法:class Foo implements Runnable public void run() try
24、 Thread.sleep(1000); catch (InterruptedException e) / 此處InterruptedException被忽略 正確寫法:class Foo implements Runnable public void run() try Thread.sleep(1000); catch (InterruptedException e) Thread.currentThread().interrupt(); / Reset interrupted status 1.6.2 不允許暴露異常的敏感信息沒有過濾敏感信息的異常堆棧往往會導(dǎo)致信息泄漏,不正確的寫法:t
25、ry FileInputStream fis = new FileInputStream(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 = n
26、ew File(System.getenv("APPDATA") + args0).getCanonicalFile(); if (!file.getPath().startsWith("c:homepath") log.error("Invalid file"); return; catch (IOException x) log.error("Invalid file"); return; try FileInputStream fis = new FileInputStream(file); catch (F
27、ileNotFoundException x) log.error("Invalid file"); return; 1.6.3 不允許拋出RuntimeException, Exception,Throwable不正確的寫法:boolean isCapitalized(String s) if (s = null) throw new RuntimeException("Null String"); private void doSomething() throws Exception /.正確寫法:boolean isCapitalized(Stri
28、ng s) if (s = null) throw new NullPointerException(); private void doSomething() throws IOException /.1.6.4 不要捕獲NullPointerException或其他父類異常不正確的寫法:boolean isName(String s) try String names = s.split(" "); if (names.length != 2) return false; return (isCapitalized(names0) && isCapita
29、lized(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);1.7 多線程編程1.7.1 確保共享變量的可見性對于共享變量,要確保一
30、個(gè)線程對它的改動對其他線程是可見的。線程可能會看到一個(gè)陳舊的共享變量的值。為了共享變量是最新的,可以將變量聲明為volatile或同步讀取和寫入操作。將共享變量聲明為volatile:final class ControlledStop implements Runnable private volatile boolean done = false; Override public void run() while (!done) try / . Thread.currentThread().sleep(1000); / Do something catch(InterruptedExcep
31、tion ie) Thread.currentThread().interrupt(); / Reset interrupted status public void shutdown() done = true; 同步讀取和寫入操作:final class ControlledStop implements Runnable private boolean done = false; Override public void run() while (!isDone() try / . Thread.currentThread().sleep(1000); / Do something ca
32、tch(InterruptedException ie) Thread.currentThread().interrupt(); / Reset interrupted status public synchronized boolean isDone() return done; public synchronized void shutdown() done = true; 1.7.2 確保共享變量的操作是原子的除了要確保共享變量的更新對其他線程可見的,還需要確保對共享變量的操作是原子的,這時(shí)將共享變量聲明為volatile往往是不夠的。需要使用同步機(jī)制或Lock同步讀取和寫入操作:fin
33、al 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 boolean flag = true; private final ReadWriteLock lock = new ReentrantReadWriteLock(); private f
34、inal 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 getFlag() readLock.lock(); try return flag; finally readLock.unlock(); 1.7.3 不要調(diào)用Thread.ru
35、n(),不要使用Thread.stop()以終止線程1.7.4 確保執(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 InetSocketAddress(host, port); Overr
36、ide 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 IOException, InterruptedException SocketReader reader = new SocketReader(&q
37、uot;somehost", 25); Thread thread = new Thread(reader); thread.start(); Thread.sleep(1000); errupt(); 1.7.5 相互依存的任務(wù)不要在一個(gè)有限的線程池執(zhí)行有限線程池指定可以同時(shí)執(zhí)行在線程池中的線程數(shù)量的上限。程序不得使用有限線程池線程執(zhí)行相互依賴的任務(wù)。可能會導(dǎo)致線程饑餓死鎖,所有的線程池執(zhí)行的任務(wù)正在等待一個(gè)可用的線程中執(zhí)行一個(gè)內(nèi)部隊(duì)列阻塞1.8 輸入輸出1.8.1 程序終止前刪除臨時(shí)文件1.8.2 檢測和處理文件相關(guān)的錯(cuò)誤Java的文件操作方法往往有一個(gè)返回值
38、,而不是拋出一個(gè)異常,表示失敗。因此,忽略返回值文件操作的程序,往往無法檢測到這些操作是否失敗。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 及時(shí)釋放資源垃圾收集器無法釋放非內(nèi)存資源,如打開的文件描述符與數(shù)據(jù)庫的連接。因此,不釋放資源,可能導(dǎo)致資源耗盡攻擊。try final
39、FileInputStream 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 handl
40、er catch (IOException e) / forward to handler1.9 序列化1.9.1 不要序列化未加密的敏感數(shù)據(jù)序列化允許一個(gè)對象的狀態(tài)被保存為一個(gè)字節(jié)序列,然后重新在稍后的時(shí)間恢復(fù),它沒有提供任何機(jī)制來保護(hù)序列化的數(shù)據(jù)。敏感的數(shù)據(jù)不應(yīng)該被序列化的例子包括加密密鑰,數(shù)字證書。 解決方法:1、 對于數(shù)據(jù)成員可以使用transient ,聲明該數(shù)據(jù)成員是瞬態(tài)的。2、 重寫序列化相關(guān)方法writeObject、readObject、readObjectNoData,防止被子類惡意重寫class SensitiveClass extends Number / . protected final Object writeObject(java.io.ObjectOutputStream out) throws NotSerializableException throw new NotS
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆河北省石家莊二十八中學(xué)中考生物全真模擬試題含解析
- 上海裝飾裝修合同范文
- GRC安裝專項(xiàng)勞務(wù)分包施工合同
- 個(gè)人抵押房屋合同
- 運(yùn)動隊(duì)訓(xùn)練合同范本
- 個(gè)人入股協(xié)議書范本
- 杭州勞務(wù)服務(wù)合同書
- 變更租賃經(jīng)營合同的補(bǔ)充協(xié)議
- 全新企業(yè)的合同管理制度
- 合同中不可抗力條款
- 支氣管鏡試題
- 贏在團(tuán)隊(duì)執(zhí)行力課件
- 北京理工大學(xué)應(yīng)用光學(xué)課件第四章
- 陰道鏡幻燈課件
- 現(xiàn)代漢語詞匯學(xué)精選課件
- PCB行業(yè)安全生產(chǎn)常見隱患及防范措施課件
- 上海音樂學(xué)院 樂理試題
- SAP中國客戶名單
- 2022年福建泉州中考英語真題【含答案】
- 淺談固定資產(chǎn)的審計(jì)
- WZCK-20系列微機(jī)直流監(jiān)控裝置使用說明書(v1.02)
評論
0/150
提交評論