天天看點

什麼叫做SQL注入式攻擊,如何防範?

所謂SQL注入式攻擊,就是攻擊者把SQL指令插入到Web表單的輸入域或頁面請求的查詢字元串中,欺騙伺服器執行惡意的SQL指令。在某些表單中,使用者輸入的内容直接用來構造(或者影響)動态SQL指令,或作為存儲過程的輸入參數,這類表單特别容易受到SQL注入式攻擊。

防範SQL注入式攻擊闖入并不是一件特别困難的事情,隻要在利用表單輸入的内容構造SQL指令之前,把所有輸入内容過濾一番就可以了。過濾輸入内容可以按多種方式進行。

● 替換單引号,即把所有單獨出現的單引号改成兩個單引号,防止攻擊者修改SQL指令的含義。

● 删除使用者輸入内容中的所有連字元,防止攻擊者順利獲得通路權限。

● 對于用來執行查詢的資料庫賬戶,限制其權限。用不同的使用者賬戶執行查詢、插入、更新、删除操作。由于隔離了不同賬戶可執行的操作,因而也就防止了原本用于執行SELECT指令的地方卻被用于執行INSERT、UPDATE或DELETE指令。

● 用存儲過程來執行所有的查詢。SQL參數的傳遞方式将防止攻擊者利用單引号和連字元實施攻擊。此外,它還使得資料庫權限可以被限制到隻允許特定的存儲過程執行,所有的使用者輸入必須遵從被調用的存儲過程的安全上下文,這樣就很難再發生注入式攻擊了。

● 檢查使用者輸入的合法性,确信輸入的内容隻包含合法的資料。資料檢查應當在用戶端和伺服器端都執行。之是以要執行伺服器端驗證,是為了彌補用戶端驗證機制脆弱的安全性。在用戶端,攻擊者完全有可能獲得網頁的源代碼,修改驗證合法性的腳本(或者直接删除腳本),然後将非法内容通過修改後的表單送出給伺服器。是以,要保證驗證操作确實已經執行,唯一的辦法就是在伺服器端也執行驗證。

● 将使用者登入名稱、密碼等資料加密儲存。加密使用者輸入的資料,然後再将它與資料庫中儲存的資料比較,這相當于對使用者輸入的資料進行了“消毒”處理。使用者輸入的資料不再對資料庫有任何特殊的意義,進而也就防止了攻擊者注入SQL指令。

● 檢查提取資料的查詢所傳回的記錄數量。如果程式隻要求傳回一個記錄,但實際傳回的記錄卻超過一行,那就當做出錯處理。