軟件開發(fā):安全編碼的九個最佳方法(一)
開發(fā)團隊的所有成員應當清楚常見的編程錯誤及原因和減少錯誤的方法,以及這些內(nèi)容對當前軟件項目的適用性。減少軟件項目安全漏洞的關(guān)鍵在于開發(fā)團隊必須遵循安全編碼的最佳方法。
驗證輸入并對輸入進行編碼
攻擊者常常針對應用程序發(fā)動劫持攻擊。這種攻擊可以采用C語言中的格式字符串的形式,或者采用Web腳本語言中的跨站腳本攻擊。如果一個Web應用程序可以接收用戶輸入,并將用戶輸入的內(nèi)容輸出或轉(zhuǎn)發(fā)給某個可信的功能,它就易于遭受攻擊。因而,正確地驗證輸入以確保它滿足應用程序的要求(例如,通過驗證用戶的輸入達到某個長度并且不包含“特定的”HTML字符,并且可以安全地處理任何非法的輸入。)如果輸入驗證允許潛在的惡意字符(例如,在Web應用程序中出現(xiàn)“<”),后果就不容樂觀。此時,應用程序就應當對這些字符編碼,使其不會被其它功能或依賴它的應用程序誤解。
白名單是很受歡迎的輸入驗證方法,它可以驗證那些遵循了確定的可接受參數(shù)的輸入并拒絕不遵循這些參數(shù)的輸入。白名單驗證已被證明可以高效地過濾與未知攻擊有關(guān)的輸入模式。相比較而言,黑名單這種方法可以驗證輸入是否與某些確定的與可疑惡意輸入有關(guān)的不可接受的參數(shù)相匹配。黑名單可以接受并未明確標識為“惡意”的所有輸入,它在防護未知攻擊方面沒有什么用處。但它可以清理某些惡意的輸入。此外,黑名單還可用來臨時過濾與零日漏洞的有關(guān)攻擊。如果要使用黑名單功能,IT能夠?qū)⑤斎朕D(zhuǎn)換為標準形式非常重要。IT應當結(jié)合使用白名單和黑名單,但應首先用黑名單。
在檢測到惡意的輸入后,就需要對其管理。最好的方法是簡單地拒絕惡意輸入,而不是試圖“凈化”它。然而,凈化有時是必要的。在這種情況下,所有被凈化的數(shù)據(jù)都應當被重新發(fā)送,以便于用白名單驗證確保其有效性。
測試情形應當包括合法數(shù)據(jù)和非法數(shù)據(jù)的提交兩個方面,而測試者應當重視似是而非(輸入驗證拒絕了合法輸入)和“似非而是”(輸入驗證接受了非法輸入)。如果客戶端驗證是作為第一層過濾而實施的,還應當測試其JavaScript情況(JavaScript在解析普通的表達式時與服務器的驗證引擎略有不同,而且會在客戶端生成似是而非的問題,并在服務器端產(chǎn)生“似非而是”的問題)。最后,測試者應當在關(guān)閉服務器端和客戶端驗證的情況下運行應用程序。這樣做會揭示接受非法數(shù)據(jù)如何影響其它應用程序?qū)?,并會暴露漏洞。在對輸入驗證實施了集中化的架構(gòu)中,測試還可以揭示是否在系統(tǒng)的其它點上需要其它的驗證。必須確保驗證不能被繞過。在客戶端/服務器的設(shè)計中,服務器的驗證是保護服務器的唯一驗證。
標準化
在表達式遵循標準格式時,它就是標準化的。標準化就是對一個表達式進行重新格式化使其滿足標準格式。標準化可以確保表達式能夠被轉(zhuǎn)化為標準格式。在驗證之前對表達式進行標準化可以減少繞過過濾器的風險。
本地化
本地化包括為使一個程序在不同國家使用而創(chuàng)建的程序變種。開發(fā)者應當為軟件的每一個本地化變種開發(fā)誤用/濫用的實例和攻擊模式。由于某些語言中的源字符串的長度更長,在不同字符編碼中字符串長度可用字節(jié)或字符來表達,以及由于從一種編碼轉(zhuǎn)換到另外一種編碼會導致緩沖區(qū)大小的增加,所以,與本地程序變種相關(guān)的主要問題都與產(chǎn)生緩沖區(qū)漏洞的可能性有關(guān)。
分析器
開發(fā)團隊應當使用分析器來管理編碼和轉(zhuǎn)換等方面?,F(xiàn)在有許多編碼方案,如十六進制編碼、Unicode編碼、URL編碼、基于語言的字符編碼等。這里存在許多困難,其中之一就是這些編碼可以通過雙重編碼的形式一起使用,從而使得標準化過程變得很困難。應用程序中內(nèi)置的一系列分析器,如Web服務器和應用程序服務器可以減少這種困難。剩下的就是輸入驗證問題了,如果這是一種基于模式的驗證方法,在分析器將輸入變成標準形式之后才進行檢查就至關(guān)重要了。這可能是一個架構(gòu)上的挑戰(zhàn),并需要謹慎管理。
軟件開發(fā)中的使用安全編碼其他方法:軟件開發(fā):安全編碼的九個最佳方法(二)