從我成立IT咨詢公司以來的十年時間,我和全球成千上萬的軟件開發(fā)員打過交道,也見過各種不同的安全故障。經(jīng)常會有人問我:什么是最糟糕的軟件安全錯誤?
當然,我不會像“OWASP Top 10”(OWASP:開放式web應用程序安全項目)那樣做一個具體的列表來告訴你答案,因為在我看來,安全問題的發(fā)生最主要來源于兩大方面:一是軟件開發(fā)人員過于專注軟件的功能規(guī)格,另一個則是過于信任軟件的安全系數(shù)。
我遇見過的軟件開發(fā)人員大多數(shù)都很聰明、很上進,而他們總是在壓力極大的環(huán)境下工作,總是在看似不可能完工的最后期限內(nèi)將產(chǎn)品做出來。在這樣的情況下,開發(fā)人員往往只關注產(chǎn)品的功能,而對其他方面,比如安全,則欠缺考慮。因為“客戶需要什么樣的功能”的問題顯然比“哪里可能出岔子”或“攻擊者如何誘騙軟件出現(xiàn)異常行為”來得更為迫切。
另一方面,開發(fā)人員普遍低估了軟件隱藏的安全威脅。因為開發(fā)人員往往過于信任用戶及用戶在代碼中所使用的應用編程接口(API)。
一旦開發(fā)人員一味注重開發(fā)功能,而不事先做足準備來防止?jié)撛诠?,那么軟件?jīng)常出現(xiàn)故障,也是理所當然的事了。
當然,功能的開發(fā)也相當重要,但是防止代碼出現(xiàn)異常的準備是必不可少的。然而,做好這點并非易事。
兩件事情或許對于做好這點有所幫助。首先,積極主動地通過應用軟件對數(shù)據(jù)進行編排處理。前期要嚴格驗證數(shù)據(jù)的輸入,后期則要確保數(shù)據(jù)的輸出不會給預期環(huán)境造成任何破壞。第二,預測異常情況,并采取合理的處理措施。只要有可能,就要積極驗證所有輸入的數(shù)據(jù)。比如,如果你要求的數(shù)據(jù)是整數(shù),那么不是整數(shù)的任何數(shù)字都將是危險的,這被稱為積極驗證;有別于消極驗證,消極驗證是指通過尋找已知的危險的輸入內(nèi)容,并阻止那些內(nèi)容輸入。但我建議最好避免采用消極驗證,因為我已看到過無數(shù)個消極驗證失敗的例子。
接下來,在輸出數(shù)據(jù)時,你需要編排處理該數(shù)據(jù),防止數(shù)據(jù)在你輸出時的任何地方引起問題。比如,要是輸出上下文是XML格式化的,那么你的用戶數(shù)據(jù)絕對不能含有“<”或“>”之類的元素。倘若沒有做到這一點,每次輸入都會受到攻擊。
對于專業(yè)人員來說,軟件就好比是小孩,安全人員則是第一看護人,他們會注意到潛伏的危險,并習慣于最先考慮哪些方面會出岔子;開發(fā)人員則更像第二看護人,他們盡量不在交通高峰期帶孩子出去散步,盡量避免出岔子。安全人員和開發(fā)人員如果能卓有成效地協(xié)同工作,大家就能夠從中受益。
最近,我與一群軟件開發(fā)人員進行合作,他們接受了我的這些建議,并且很快便心領神會。事后,我的客戶告訴我,在這個項目完工后的一天內(nèi),他數(shù)次接到了開發(fā)人員和安全團隊提出的請求,要求探討兩個部門如何能夠更好地協(xié)同工作。(編譯沈建苗)