做學生資訊管理系統的時候,很多同學就已經提到這個問題了。但是沒有去深究,後來鐵道部購票網出了SQL注入的問題,據說這個問題屬於菜鳥級。然後驗收的時候,師父跟我說了說SQL注入的問題,於是才有了這篇別人早寫過很久的文章。
首先說說什麼是SQL注入。SQL 注入是一種攻擊方式,在這種攻擊方式中,惡意代碼被插入到字串中,然後將該字串傳遞到 SQL Server 的執行個體以進行分析和執行。任何構成 SQL 陳述式的過程都應進行注入漏洞檢查,因為 SQL Server 將執行其接收到的所有文法有效查詢。一個有經驗的、堅定的攻擊者甚至可以巨集指令引數化資料。簡單的說就是:攻擊者可以通過SQL注入來非法操作你的資料庫。只要注入的 SQL 代碼文法正確,便無法採用編程方式來檢測篡改。因此,必須驗證所有使用者輸入,並仔細檢查在您所用的伺服器中執行構造
SQL 命令的代碼。下面是上網查詢的如何防止SQL注入的一些資料,做個總結。
防止SQL注入:
1)驗證所有輸入:始終通過測試類型、長度、格式和範圍來驗證使用者輸入。
對應用程式接收的資料不做任何有關大小、類型或內容的假設。
測試輸入的大小和資料類型,強制執行適當的限制。這有助於防止有意造成的緩衝區溢位。
測試字串變數的內容,只接受所需的值。拒絕包含位元據、逸出序列和注釋字元的輸入內容。這有助於防止指令碼注入,防止某些緩衝區溢位攻擊。
使用 XML 文檔時,根據資料的架構對輸入的所有資料進行驗證。
絕不直接使用使用者輸入內容來產生 Transact-SQL 陳述式。
使用預存程序來驗證使用者輸入。
在多層環境中,所有資料都應該在驗證之後才允許進入可信地區。未通過驗證過程的資料應被拒絕,並向前一層返回一個錯誤。
實現多層驗證。對無目的的惡意使用者採取的預防措施對堅定的攻擊者可能無效。更好的做法是在使用者介面和所有跨信任邊界的後續點上驗證輸入。
絕不串聯未驗證的使用者輸入。字串串聯是指令碼注入的主要輸入焦點。
如果可能,拒絕包含以下字元的輸入:“;”、“'”、“xp_”
2)在預存程序中使用參數化輸入:如果使用預存程序,則應使用參數作為預存程序的輸入。
3)在動態 SQL 中使用參數集合
4)使用 QUOTENAME() 和 REPLACE() 封裝參數
以上內容有些目前還不懂,比如預存程序之類,目前在資料庫部分中還沒有使用過。所以,這些需要等段時間在來學習。