什麽是SQL註入,如何預防?請舉例說明。
所謂SQL註入攻擊,就是攻擊者將SQL命令插入到Web表單的輸入字段或者頁面請求的查詢字符串中,誘騙服務器執行惡意的SQL命令。在某些表單中,用戶的輸入直接用於構造(或影響)動態SQL命令,或者作為存儲過程的輸入參數,這種表單特別容易受到SQL註入攻擊。常見的SQL註入攻擊過程類如下:(1)壹個ASP.NET Web應用有壹個登錄頁面,這個頁面控制著用戶是否有權限訪問應用,它要求用戶輸入用戶名和密碼。⑵登錄頁面中輸入的內容將直接用於構造動態SQL命令或直接用作存儲過程的參數。下面是壹個ASP的例子。NET的應用構造查詢:system . text . stringbuilder query = new system . text . stringbuilder(" select * from users where log in = ' ")。追加(txtLogin。正文).追加("'和密碼= ').追加(txtPassword。正文).追加(“”);⑶攻擊者在用戶名和密碼輸入框中輸入類似“'或' 1'='1 '的內容。(4)在用戶的輸入被提交給服務器之後,服務器運行上述ASP.NET代碼來構造SQL命令以查詢用戶。但是由於攻擊者輸入的內容非常特殊,所以最終的SQL命令變成:select * from users where login = '或' 1' =' 1 '和password = '或' 1' =' 1 '。(5)服務器執行查詢或存儲過程,將用戶輸入的身份信息保存在服務器中。[6]由於SQL命令實際上已經被註入攻擊修改,用戶的身份已經無法真正驗證,所以系統會錯誤地授權攻擊者。如果攻擊者知道應用程序將直接使用表單中輸入的內容來驗證查詢的身份,他將試圖輸入壹些特殊的SQL字符串來篡改查詢並改變其原始功能,從而欺騙系統授予訪問權限。不同的系統環境可能對攻擊者造成不同的傷害,這主要是由應用程序訪問數據庫的安全權限決定的。如果用戶的帳戶具有管理員或其他高級權限,攻擊者可以對數據庫中的表執行各種操作,包括添加、刪除或更新數據,甚至直接刪除表。二、如何預防?幸運的是,防止ASP.NET應用程序受到SQL註入攻擊並不是特別困難,只要在使用表單的輸入內容構造SQL命令之前過濾掉所有的輸入內容。可以通過多種方式過濾輸入。(1)對於動態構造SQL查詢的場合,可以使用以下技巧:壹、替換單引號,即將所有單引號改為兩個單引號,防止攻擊者修改SQL命令的含義。再看前面的例子,“SELECT * From users where log in = ' or ' 1 ' = ' 1 ' and password = ' or ' 1 ' = ' 1 '”顯然會和“SELECT * From users where log in = ' or ' 1 ' = ' 1 ' and password = ' or ' 1 '”得到不同的結果。第二,刪除用戶輸入中的所有連字符,防止攻擊者構造“select * from users where log in = ' MAS '-and password = ' '”這樣的查詢,因為這個查詢的後半部分已經被註釋掉,不再有效,攻擊者只要知道壹個合法的用戶登錄名,而完全不知道用戶的密碼,就可以成功獲得訪問權限。第三,限制用於執行查詢的數據庫帳戶的權限。使用不同的用戶帳戶執行查詢、插入、更新和刪除操作。因為可以由不同帳戶執行的操作是隔離的,所以它還防止了最初用於執行SELECT命令的位置被用於執行INSERT、UPDATE或DELETE命令。⑵使用存儲過程執行所有查詢。SQL參數的傳遞方式將防止攻擊者使用單引號和連字符進行攻擊。此外,它還允許數據庫權限被限制為只允許特定的存儲過程執行,並且所有用戶輸入必須符合被調用存儲過程的安全上下文,因此很難再有註入攻擊。(3)限制表單或查詢字符串輸入的長度。如果用戶的登錄名最多只有10個字符,那麽就不要識別表單中輸入的超過10個字符,這樣會大大增加攻擊者在SQL命令中插入有害代碼的難度。(4)檢查用戶輸入的合法性,確保輸入只包含合法數據。數據校驗要在客戶端和服務器端都進行——之所以要進行服務器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。在客戶端,攻擊者完全有可能獲取壹個網頁的源代碼,修改驗證合法性的腳本(或者直接刪除腳本),然後通過修改後的形式將非法內容提交給服務器。因此,確保驗證操作確實已經執行的唯壹方法是在服務器端也執行驗證。您可以使用許多內置的驗證對象,如RegularExpressionValidator,它可以自動生成用於驗證的客戶端腳本。當然,也可以插入服務器端的方法調用。如果找不到現成的驗證對象,可以通過CustomValidator自己創建壹個。⑸加密並保存用戶登錄名、密碼等數據。對用戶輸入的數據進行加密,然後與數據庫中存儲的數據進行比較,相當於對用戶輸入的數據進行了“消毒”,用戶輸入的數據對數據庫不再有任何特殊意義,從而防止了攻擊者註入SQL命令。系統。web . security . forms authentication類有壹個hashpasswordforstoringconfigfile,非常適合輸入數據的消毒。[6]檢查提取數據的查詢返回的記錄數。如果程序只要求返回壹條記錄,但實際返回的記錄不止壹行,則視為錯誤。