Q1:什麼是SQL注入?
A1:SQL注入是注入式攻擊中的常見類型,SQL注入式攻擊是未將代碼與數據進行嚴格的隔離,導致在讀取用戶數據的時候,錯誤地將數據作爲代碼的一部分執行,從而導致一些安全問題。
典型的SQL注入的例子是當對SQL語句進行字符串拼接操作時,直接使用未加轉義的用戶輸入內容作爲變量。例如:
var testCondition; //測試內容變量
testCondition = Request.from("testCondition")
var sql = "select * from TableA where id = ' " + testCondition + " '";
上例中,如果用戶輸入的ID只是一個數字的話是沒有問題的,可以執行正常的查詢語句,但是如果在testCondition中用;將數字ID與其他的SQL語句隔開的話,就會帶來意想不到的結果,比如輸入drop、delete等。
Q2:怎麼預防SQL注入?
A2:根據SQL注入的原理,應從以下幾個方面來考慮:
- 過濾用戶輸入參數中的特殊字符,從而降低被SQL注入的風險。
- 禁止通過字符串拼接的SQL語句,嚴格使用參數綁定傳入的SQL參數。
- 合理使用數據庫訪問框架提供的防注入機制,比如MyBatis提供的#{ }綁定參數,從而防護SQL注入。同時一定要謹慎的使用${ },${ }相當於使用字符串拼接SQL。
要正確的使用參數化綁定SQL變量!