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