建站廣告?zhèn)€人網(wǎng)站首頁設(shè)計(jì)
本系列文章主要圍繞《GB/T 38674—2020 信息安全技術(shù) 應(yīng)用軟件安全編程指南》進(jìn)行講解,該標(biāo)準(zhǔn)是2020年4月28日,由國家市場監(jiān)督管理總局、國家標(biāo)準(zhǔn)化管理委員會(huì)發(fā)布,2020年11月01日開始實(shí)施。我們對(duì)該標(biāo)準(zhǔn)中一些常見的漏洞進(jìn)行了梳理,大家感興趣的話可以自己去下載下來學(xué)習(xí)一下,里面有一些最佳實(shí)踐是比較好的。?
本標(biāo)準(zhǔn)從程序安全和環(huán)境安全兩個(gè)方面提出了提升應(yīng)用安全性的編程最佳實(shí)踐。其中,程序安全部分描述軟件在資源使用、代碼實(shí)現(xiàn)、安全功能方面的安全性規(guī)范,環(huán)境安全部分描述軟件的安全管理配置規(guī)范。前面的文章為大家講解了程序安全,本文我們針對(duì)代碼安全的并發(fā)程序安全部分進(jìn)行解讀。
【并發(fā)程序安全】
這一塊是程序中經(jīng)常出現(xiàn)的一些問題,我們在功能測試、性能測試中經(jīng)常會(huì)遇到的一些問題。
1.確保共享數(shù)據(jù)的線程安全:
(1)確保所有的全局變量、線程間的共享可變數(shù)據(jù)是線程安全的。
(2)對(duì)所有需確保線程安全的數(shù)據(jù)通過同步方法或代碼塊進(jìn)行保護(hù)。
2.確保共享變量、數(shù)據(jù)的可見性:
(1)對(duì)共享變量、數(shù)據(jù)的讀或?qū)懖僮骶褂猛皆L問。
(2)所有執(zhí)行讀或?qū)懖僮鞯木€程都應(yīng)在同一個(gè)鎖上同步,以確保所有線程都能看到共享變量或數(shù)據(jù)的最新值。
比如一些訂單的操作,在讀和寫的時(shí)候要上同一個(gè)鎖,保證是一致的。一方讀的時(shí)候?qū)Ψ秸趯?#xff0c;導(dǎo)致讀的是之前的信息,這樣這個(gè)訂單就容易產(chǎn)生一些交易上的問題。
3.需確保能夠終止處于阻塞狀態(tài)的任務(wù)和線程。
有些任務(wù)和線程處在阻塞狀態(tài)我們可以及時(shí)阻止,我們要能夠預(yù)見到什么程度下會(huì)出現(xiàn)阻塞,在程序上做一個(gè)防護(hù),使其能夠及時(shí)終止。
4.僅在循環(huán)體中執(zhí)行線程的掛起操作,并在每次掛起線程之前檢查線程繼續(xù)執(zhí)行要滿足的條件。
5.不要在條件變量同步等待操作中使用多余一個(gè)互斥條件。
這部分并發(fā)程序安全在標(biāo)準(zhǔn)中也給出了最佳實(shí)踐,大家也可以去看一看。給大家舉一個(gè)例子,有一個(gè)類,SimpleDateFormat(時(shí)間格式化),這個(gè)類就是線程不安全的,現(xiàn)在已經(jīng)不建議使用了,在我們代碼審計(jì)的過程中,這個(gè)類出現(xiàn)的頻率還很高,很多單位和項(xiàng)目都還在用這個(gè)類。這個(gè)類是線程不安全的,如果你非要用的話,就必須是局部變量的使用,這樣性能會(huì)比較差。
在java8中有一個(gè)替代它的的類,DateTimeFormatter這個(gè)是線程安全的,可以替代SimpleDateFormat。我們在做項(xiàng)目的時(shí)候一定要用最新的、安全的一些類、方法和框架。
后面的文章會(huì)繼續(xù)對(duì)《GB/T 38674—2020 信息安全技術(shù) 應(yīng)用軟件安全編程指南》的其他部分進(jìn)行解讀,歡迎繼續(xù)關(guān)注。
(本系列文章根據(jù)《優(yōu)品軟件培育計(jì)劃》公益直播內(nèi)容整理,可以私信我獲取直播回放鏈接。)