如何預防web應用程式出現漏洞??

如今的Web應用程式可能會包含危險的安全缺陷。這些應用程式的全球化部署使其很容易遭受攻擊,這些攻擊會發現並惡意探測各種安全漏洞。Web應用程式需要有深度防禦的措施來避免和減少安全性漏洞。

如何預防web應用程式出現漏洞?

方法/步驟

輸入校驗

大多數的安全漏洞是因為目標應用程式沒有正確地校驗輸入資料。所以,應用程式要考慮到所有惡意的輸入直到能證明其合法,這要涵蓋不可信環境中的所有資料。

輸入校驗是第一道防線,總體來講就是縮小應用程式允許輸入的範圍,它會直接作用在使用者提供的資料上。這種型別的防禦要依賴輸入引數在一個合法的範圍內,或者如果使用者提供了超出了範圍的值就會停止執行。在Web應用程式中,這首先要標準化輸入將其轉換到基線字符集和編碼。接下來,應用程式必須對標準化的輸入使用過濾策略,拒絕那些值在合法範圍之外的輸入。這種方式能夠避免很多Web應用程式中的問題,在執行輸入校驗時會使用正向模式匹配或正向校驗。在這種情況下,開發人員建立規則來識別那些可接受的輸入而不是識別有什麼輸入是不可接受的。儘管開發人員不能預測所有型別的攻擊,但他們應該能夠說明所有型別的合法輸入。

關鍵問題在於,輸入校驗通常使用地並不充分,這是因為輸入引數的資料域允許存在惡意資料,這是與校驗執行相獨立的。例如,在SQL注入漏洞中,大多數的SQL語句使用引號作為字串分隔符,這就意味著黑客可以使用它來執行SQL注入攻擊。但是,在有些情況下,字串輸入域必須允許存在引號值,所以應用程式不能排除所有包含引號的值。

熱點防護

任何型別的攻擊都是以熱點為目標的,熱點指的就是應用程式中可能會有某種型別漏洞的程式碼。通用的輸入校驗會在應用程式中進行或者在整個Web應用程式上下文中修改輸入,與之相比,第二道防線關注於保護重要的熱點,例如保護那些真正使用輸入域值的程式碼行。

一個具體的例子就是SQL注入攻擊,它們大多數會使用單引號或雙引號。有些程式語言提供了對這些字元的轉碼機制,這樣它們就能用在SQL語句中了,但是隻能用來在語句中分隔值。4但是這些技術有兩個問題。第一,更高階的注入技術,例如聯合使用引號和轉義字元,可以繞過這些機制。第二,引入轉義字元會增加字串的長度,如果結果字串的長度超過資料庫限制的話,可能會導致資料截斷。

正確使用引數化命令是預防注入攻擊最有效的方式。1在這種情況下,開發人員定義命令的結構,並使用佔位符來代表命令的變數值。稍後,當應用程式將對應的值關聯到命令上時,命令直譯器會正確地使用它們而不會涉及到命令的結構。

這種技術最著名的用法是資料庫的預處理語句,也被稱為引數化查詢。4 當應用程式建立預處理語句時,語句傳送到了資料庫端。應用程式使用佔位符來表示查詢的可變部分,佔位符通常會是問號或標籤。隨後,每次查詢執行時,應用程式都要往對應的可變部分繫結值。不管資料的內容是什麼,應用程式會一直使用這個表示式作為一個值而並沒有SQL程式碼。因此,不可能修改查詢的結構。

為了確保正確使用資料,很多語言允許型別繫結。但是預處理語句本身並不能修復不安全的語句——開發人員必須正確地使用它們。例如,像傳統語句一樣使用預處理語句——也就是使用字串拼接來繫結SQL查詢——而不是對查詢的可變部分使用佔位符會導致類似的漏洞。

輸出校驗

在將一個程序的輸出傳送之前進行校驗能夠避免使用者收到他們不應該看到的資訊,例如應用程式內部的異常細節,這些資訊有助於發起其他的攻擊。在輸出校驗的另一個例子當中,保護系統會搜尋應用程式輸出的關鍵資訊,如信用卡號,並在傳送給前端之前用星號代替。將資訊編碼是能夠避免XSS漏洞的一種輸出校驗方式。如果傳送給瀏覽器的資料要顯示在Web頁面上,它應該進行HTML編碼或百分號編碼,這取決於它在頁面的位置。通過這種方式,XSS所用的惡意字元不再具有破壞性,而且編碼會保留資料的原來意義。

相關問題答案