相關文章(zhāng)
欄目分(fēn)類 classification
無Bug的(de)安全代碼?看防禦性編程的(de)藝術
爲什(shén)麽開發者不編寫安全的(de)代碼?我們在這(zhè)并不是要再一次討(tǎo)論「整潔代碼」。我們要從純粹的(de)實用(yòng)觀點出發,討(tǎo)論軟件的(de)安全性和(hé)保密性。是的(de),因爲不安全的(de)軟件不僅無用(yòng),而且還(hái)可(kě)怕。我們來(lái)看看什(shén)麽是不安全的(de)軟件。
爲什(shén)麽我認爲在特定種類的(de)工程中,防禦性編程是解決這(zhè)些問題好辦法?
我們來(lái)探索一下(xià)我提出的(de)關鍵點,來(lái)完成一個(gè)防禦性編程的(de)實現。
這(zhè)就是所謂的(de)智能代碼重用(yòng)。擁抱它吧。
在很多(duō)人(rén)參與的(de)大(dà)型項目中,我們有許多(duō)方式編寫并組織代碼。這(zhè)也(yě)導緻混亂甚至更多(duō)的(de) bug。這(zhè)也(yě)是我們需要加強規範代碼風格和(hé)代碼檢查的(de)原因,讓生活更輕松。
- 1996年6月(yuè)4日,歐洲航天局的(de) Ariane 5 Flight 501 在起飛(fēi)後 40 秒被引爆。因爲導航軟件裏的(de)一個(gè) bug,這(zhè)個(gè)價值 10 億美(měi)金的(de)運載火箭不得(de)不自毀。
-
- 1991年2月(yuè)25日,MIM-104 Patriot(愛(ài)國者)裏的(de)一個(gè)軟件錯誤使它的(de)系統每一百小時(shí)有三分(fēn)之一秒的(de)時(shí)鐘(zhōng)偏移,導緻定位攔截入侵導彈失敗。結果伊拉克的(de)飛(fēi)毛腿導彈擊中宰赫蘭(沙特阿拉伯東北(běi)部城(chéng)市)的(de)一個(gè)美(měi)軍軍營,28 人(rén)死亡,100 多(duō)人(rén)受傷。
- 其他(tā)案例,請參見《Bug 引發的(de) 18 次重大(dà)事故》。
防禦性編程初窺
爲什(shén)麽我認爲在特定種類的(de)工程中,防禦性編程是解決這(zhè)些問題好辦法?
抵禦那些不可(kě)能的(de)事,因爲看似不可(kě)能的(de)事也(yě)會發生。防禦性編程中有很多(duō)防禦方式,這(zhè)也(yě)取決于你的(de)軟件項目所需的(de)「安全」級别和(hé)資源級别。
防禦性編程是防禦式設計的(de)一種形式,用(yòng)來(lái)确保軟件在未知的(de)環境中能繼續運行。防禦性編程的(de)實踐往往用(yòng)于需要高(gāo)可(kě)用(yòng)性、安全性、保密性的(de)地方。—— 維基百科我個(gè)人(rén)相信這(zhè)種方法适合很多(duō)人(rén)參與的(de)大(dà)型、長(cháng)期的(de)項目。例如,一個(gè)需要大(dà)量維護的(de)開源項目。
我們來(lái)探索一下(xià)我提出的(de)關鍵點,來(lái)完成一個(gè)防禦性編程的(de)實現。
永遠(yuǎn)不要相信用(yòng)戶輸入
設想你總是獲取到你不想要的(de)東西。因爲像我們說過的(de),我們預期的(de)是異常情況的(de)出現,(所以)要時(shí)刻防備用(yòng)戶輸入以及通(tōng)常會傳入你系統的(de)東西,這(zhè)是你成爲一個(gè)防禦性程序員(yuán)的(de)方法。試著(zhe)做(zuò)到盡可(kě)能的(de)嚴格,确保輸入的(de)值就是你所期望的(de)值。數據庫抽象化(huà)
在 OWASP Top 10 Security Vulnerabilities 排首位的(de)是注入攻擊。這(zhè)意味著(zhe)有些人(rén)(很多(duō)人(rén))還(hái)沒有使用(yòng)安全的(de)工具來(lái)查詢數據庫。請使用(yòng)數據庫抽象包或庫。在 PHP 裏你可(kě)以使用(yòng)PDO 來(lái)确保基本的(de)注入攻擊防範。不要重複發明(míng)輪子
你不用(yòng)框架(或微框架)嗎?好吧恭喜你,你喜歡毫無理(lǐ)由地做(zuò)額外的(de)工作。這(zhè)并不僅跟框架有關,也(yě)意味著(zhe)你可(kě)以方便地使用(yòng)已經存在的(de)、經過測試的(de)、受萬千開發者信任的(de)、穩定的(de)新特性,而不是你隻爲了(le)自己從中受益而制作的(de)東西。你自己創建方法的(de)唯一原因是你需要的(de)東西不存在,或存在但不符合你的(de)需求(性能差、缺失特性等等)。這(zhè)就是所謂的(de)智能代碼重用(yòng)。擁抱它吧。
不要相信開發者
防禦性編程與防禦性駕駛相關聯。在防禦性駕駛中,我們假設周圍的(de)每個(gè)人(rén)都可(kě)能犯錯。所以我們要留意别人(rén)的(de)行爲。相同概念也(yě)适用(yòng)于防禦性編程,我們作爲開發者不要相信其他(tā)開發者的(de)代碼。我們同樣也(yě)不要相信我們的(de)代碼。在很多(duō)人(rén)參與的(de)大(dà)型項目中,我們有許多(duō)方式編寫并組織代碼。這(zhè)也(yě)導緻混亂甚至更多(duō)的(de) bug。這(zhè)也(yě)是我們需要加強規範代碼風格和(hé)代碼檢查的(de)原因,讓生活更輕松。
下(xià)一篇:提高(gāo) C++編程技術7種可(kě)靠方法推薦
說點什(shén)麽吧
- 全部評論(0)
還(hái)沒有評論,快(kuài)來(lái)搶沙發吧!