防止緩沖區(qū)溢出攻擊的策略
了解了緩沖區(qū)溢出是如何發(fā)生的以后,如何防止黑客利用緩沖區(qū)溢出攻擊并控制你的本地應(yīng)用程序就是一個很重要的問題了。
避免使用編譯器中自帶的庫文件
編程語言通常都要帶有庫文件。如果一個庫文件具有某些漏洞,任何包括該庫文件的應(yīng)用程序就都會有這些漏洞。因此,黑客往往會先試圖利用常用的庫文件中已知的漏洞來達(dá)到攻擊本地應(yīng)用程序的目的。
庫文件本身也不可靠。雖然最新的編譯器都開始加入大量可靠的庫文件,但長期以來庫文件為了提供了快速、簡單的方式來完成任務(wù),幾乎沒有考慮到安全編碼的問題。C + +編程語言就是這種形式的最典型代表。而用C + +編寫的程序中依賴的標(biāo)準(zhǔn)庫就很容易在運行時產(chǎn)生錯誤,這也為希望利用緩沖區(qū)溢出進行攻擊的黑客們提供了實現(xiàn)他們想法的機會。
驗證所有的用戶輸入
要在本地應(yīng)用程序上驗證所有的用戶輸入,首先要確保輸入字符串的長度是有效長度。舉個例子,假設(shè)你的程序設(shè)計的是接受50個文本字符的輸入,并將它們添加到數(shù)據(jù)庫里。如果用戶輸入75個字符,那么他們就輸入了超出數(shù)據(jù)庫可以容納的字符,這樣以來誰都不能預(yù)測程序接下來的運行狀況。因此,用戶的輸入應(yīng)該這樣設(shè)計:在用戶輸入文本字符串時,先將該字符串的長度同最大允許長度進行比較,在字符串超過最大允許長度時能對其進行必要的攔截。
過濾掉潛在的惡意輸入
過濾是另一個很好的防御措施。先看下面例子中的ASP代碼:
這是從用戶的輸入中過濾掉HTML代碼,撇號和引號的代碼。
strNewString = Request.Form("Review")
strNewString = Replace(strNewString, "&", "& amp;")
strNewString = Replace(strNewString, "<", "& lt;")
strNewString = Replace(strNewString, ">", "& gt;")
strNewString = Replace(strNewString, "'", "`")
strNewString = Replace(strNewString, chr(34), "``")
上面的代碼用于目前我正在開發(fā)的電子商務(wù)網(wǎng)站中。這樣做的目的是為了過濾掉可能會導(dǎo)致數(shù)據(jù)庫出現(xiàn)問題的HTML代碼和符號。在HTML代碼中,使用"<"和">"的符號來命名一個HTML標(biāo)簽。為了防止用戶可能會在他們的輸入里嵌入HTML代碼,因此程序過濾掉了"<"和">"符號。
在ASP代碼中,撇號,引號和連字符都是保留符號。這些保留的符號不可以包括在用戶的輸入中,否則它們會導(dǎo)致應(yīng)用程序崩潰。例如,如果用戶輸入一個文本行中只使用了一個撇號,之后登陸數(shù)據(jù)庫時,這個命令將會失敗,因為ASP需要利用成對的撇號將文本括起來提交到數(shù)據(jù)庫里;ASP不知道如何處理用戶的輸入中的撇號。為了防止這種情況發(fā)生,以上的代碼可以尋找到輸入字符串中的撇號,并以“'“替代它。
測試應(yīng)用程序
為了保護程序免受緩沖區(qū)溢出的攻擊,驗證和過濾用戶的輸入已經(jīng)實施很久了。但在部署應(yīng)用程序之前,你仍然需要對它進行全面徹底的測試。應(yīng)當(dāng)有專門的人來仔細(xì)地審查應(yīng)用程序,并試圖使它們崩潰。讓他們嘗試輸入長的字符串或保留字符。如果你的應(yīng)用程序在編寫中已經(jīng)做了足夠的工作,它應(yīng)該能應(yīng)付各種各樣的情況。如果程序崩潰了,最好馬上把問題找出來,而不要等到已經(jīng)應(yīng)用之后。
【編輯推薦】