相信大家對於SQL注入都有一定了解,也都知道SQL引數化查詢可以防止SQL注入,那為什麼SQL引數化查詢可以防止注入呢?關於這個問題估計也是有不少人是不清楚的。
我們說的SQL注入是指使用者透過提交資料,拼裝構造了惡意的資料庫SQL語句,從而進行攻擊行為。
比如有這樣一段SQL:
此時如果userName處傳入的是: " or 1=1 -- ,那麼SQL就會變成下面這樣的:
而 -- 代表的是註釋,此時SQL的條件變成了使用者名稱為空字串或者1=1(永為真),並不需要校驗密碼了。
對使用者輸入的資料做過濾及轉義處理;
以儲存過程來執行,比較麻煩;
SQL預編譯/引數化查詢。
引數化查詢其實採用了預編譯的方法,先將SQL語句中的引數部分進行編譯,生成對應的臨時變數集,然後再使用對應的設定方法為這些臨時變數進行賦值,在賦值前會對傳入的引數進行強制型別檢查和相關安全檢查,這樣一來就避免了SQL注入。
比如上面那段SQL,如果把使用者名稱以引數化傳遞(如:@userName),資料庫對SQL指令編譯後(知道@userName處應該傳遞的是字串),在接收到 @userName 引數值後,即使字串裡有單引號或者註釋這些字元,也都會被當成字串來處理,不會把它把成SQL裡的關鍵字、定界符等來處理。
相信大家對於SQL注入都有一定了解,也都知道SQL引數化查詢可以防止SQL注入,那為什麼SQL引數化查詢可以防止注入呢?關於這個問題估計也是有不少人是不清楚的。
SQL注入是什麼?我們說的SQL注入是指使用者透過提交資料,拼裝構造了惡意的資料庫SQL語句,從而進行攻擊行為。
比如有這樣一段SQL:
select * from user where userName="susan" and pwd="12345"此時如果userName處傳入的是: " or 1=1 -- ,那麼SQL就會變成下面這樣的:
select * from user where userName="" or 1=1 -- " and pwd="12345"而 -- 代表的是註釋,此時SQL的條件變成了使用者名稱為空字串或者1=1(永為真),並不需要校驗密碼了。
防止SQL的手段對使用者輸入的資料做過濾及轉義處理;
以儲存過程來執行,比較麻煩;
SQL預編譯/引數化查詢。
引數化查詢為什麼可以防止SQL注入?引數化查詢其實採用了預編譯的方法,先將SQL語句中的引數部分進行編譯,生成對應的臨時變數集,然後再使用對應的設定方法為這些臨時變數進行賦值,在賦值前會對傳入的引數進行強制型別檢查和相關安全檢查,這樣一來就避免了SQL注入。
比如上面那段SQL,如果把使用者名稱以引數化傳遞(如:@userName),資料庫對SQL指令編譯後(知道@userName處應該傳遞的是字串),在接收到 @userName 引數值後,即使字串裡有單引號或者註釋這些字元,也都會被當成字串來處理,不會把它把成SQL裡的關鍵字、定界符等來處理。