軟件工程中,不論使用哪種開發(fā)語言板甘,安全性一直是一個非常棘手卻又重要的問題党瓮。安全性是軟件開發(fā)領(lǐng)域永遠(yuǎn)的主題之一,而且隨著互聯(lián)網(wǎng)的蜂擁發(fā)展而帶動的新技術(shù)的興起與革命(比如近幾年火起來的node.js盐类,python寞奸,go等呛谜,甚至微軟也開源后的.net Core),軟件工程中的安全性更加的凸顯與重要了枪萄。
那么隐岛,什么才是危險(xiǎn)的呢?我的第一反應(yīng)是注入攻擊瓷翻,比如SQL注入攻擊聚凹。一個典型的場景是WEB應(yīng)用中,用戶登陸功能齐帚,根據(jù)用戶輸入的用戶名密碼獲取相應(yīng)的數(shù)據(jù)妒牙,那么SQL注入就應(yīng)運(yùn)而生,模擬用戶名对妄,密碼加入特殊字符湘今,加入惡意腳本等等手段,進(jìn)而造成不了可挽回的后果剪菱。比如象浑,正常腳本當(dāng)如:
select * from userInfo where username='input_Name' and password='input_Pwd or'
那么,如果是這樣的呢琅豆?
select * from userInfo where username='input_Name' and password='input_Pwdte' or 1=1 or ''
關(guān)于如何編寫安全的Java代碼愉豺,Sun官方給了一份指南,有興趣的同學(xué)可以參考這篇文章茫因,大致為:
? 靜態(tài)字段
? 縮小作用域
? 公共方法和字段
? 保護(hù)包
? equals方法
? 如果可能使對象不可改變
? 不要返回指向包含敏感數(shù)據(jù)的內(nèi)部數(shù)組的引用
? 不要直接存儲用戶提供的數(shù)組
? 序列化
? 原生函數(shù)
? 清除敏感信息
比如蚪拦,DoS是一種常見的網(wǎng)絡(luò)攻擊,有人戲稱為“洪水攻擊”驰贷。其慣用手法是通過某種手段,比如大量的機(jī)器發(fā)送請求括袒,將目標(biāo)網(wǎng)站寬帶和其資源耗盡,導(dǎo)致用戶無法正常訪問锹锰,甚至服務(wù)器的宕機(jī)。
而對于此類問題漓库,如果單從服務(wù)器級別考慮恃慧,多少欠缺,我們或許需要考慮程序級別的攻擊痢士,比如Java,JVM怠蹂,以及涉及到的線程方面的安全善延,應(yīng)用程序的瑕疵等進(jìn)行低成本的DoS攻擊。
而在面試中城侧,我們都會被問到安全性的問題易遣,卻大多比較多泛泛,大而廣赞庶,而大多數(shù)的安全性問題都與代碼安全性有關(guān)澳骤。我們回顧下Java代碼的運(yùn)行過程:
首先編譯器把.java文件編程成.class字節(jié)碼文件,然后由類加載器負(fù)責(zé)把.class文件加載到JVM为肮,再由字節(jié)碼校驗(yàn)進(jìn)行校驗(yàn),然后由Java解釋器負(fù)責(zé)把該類文件解釋為機(jī)器碼執(zhí)行茅特。
在類加載器加載.class文件到j(luò)ava虛擬機(jī)的過程中棋枕,類加載器通過區(qū)分本機(jī)文件系統(tǒng)的類和網(wǎng)絡(luò)系統(tǒng)導(dǎo)入的類增加安全性(不允許網(wǎng)絡(luò)上的應(yīng)用程序修改本地的數(shù)據(jù))白修,本機(jī)的類先被加載重斑,一旦所有的類加載完,執(zhí)行文件的內(nèi)存劃分就固定了窥浪,然后字節(jié)碼校驗(yàn)器開始校驗(yàn).class字節(jié)碼文件,字節(jié)碼校驗(yàn)器不檢查那些可信任的編譯器所產(chǎn)生的類文件假颇。通過之后,java解釋器材負(fù)責(zé)把類文件解釋成為機(jī)器碼進(jìn)行執(zhí)行笨鸡。
a b c 都是int類型的數(shù)值 if(a - b < c) { // … }
這段看似簡單坦冠,沒毛病的代碼會引發(fā)下列問題:
如果b<0,而造成的數(shù)據(jù)溢出蓝牲,你能想象出多少問題?例衍!而對于越界的處理雖然Java底層給出了很好的解決已卸,但是數(shù)值而造成內(nèi)存問題不容小覷硼一。
當(dāng)然累澡,過多的考慮安全性問題,勢必會造成應(yīng)用程序的冗余甚至疲軟般贼,這些需要視情況而定,而不可蓋棺而論蕊梧。
再比如腮介,對于一段可能出現(xiàn)問題的代碼肥矢,常用手段 try … catch(){… },那么問題來了叠洗,catch的是什么?而一般情況下十艾,我們程序需要抓取到catch腾节,因?yàn)橐鋈罩咎幚砼备敲慈罩局胁豢苫蛉钡挠蓄愃拼a位置禀倔,方法名,以及錯誤原因等愧杯,甚至包含了敏感信息鞋既。當(dāng)然力九,不可避免邑闺,我的建議是,盡量使用內(nèi)部標(biāo)識的異常信息抵乓,而返回給客戶端的類似異常消息盡量少的自動返回的異常消息。
對于安全標(biāo)準(zhǔn)特別高的系統(tǒng)灾炭,甚至可能要求敏感信息被使用后,要立即明確再內(nèi)存中銷毀蜈出,以免被探測到;或者避免在發(fā)生core dump時偷厦,意外暴露燕刻。
開發(fā)和測試階段
1. 盡量的規(guī)范化代碼,可參考《阿里巴巴開發(fā)手冊》
2. 盡量多的code review酌儒,避免不必要尷尬代碼出現(xiàn)
3. 在代碼check-in等環(huán)節(jié)枯途,利用hook機(jī)制去調(diào)用規(guī)則檢查工具,保證不合規(guī)范代碼進(jìn)入OpenJDK代碼庫
部署階段
可參考JDK在加密方法的路線圖
以上皆為日常開發(fā)總結(jié)酪夷,也借鑒網(wǎng)上大神的文章,略略整理一二鸥印,權(quán)作學(xué)習(xí)使用坦报,當(dāng)然面試能幫到不慎感動了库说,以后有機(jī)會再做梳理片择。
歡迎指點(diǎn)。