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