Concept

在輸入字串夾帶惡意SQL語句,來改變原有語意,達成竊取或破壞資料的行為

案例

後端SQL語句

1
2
//後端sql
sql = "SELECT * FROM USER_INFO WHERE Account = ('"+ account +"') AND UserPassword = ('"+password+"'");

前端輸入訊息

  • account: 'OR 1=1–
  • password: 'OR 1=1–

後端傳送到DB

1
2
3
4
5
SELECT * 
FROM
USER_INFO
WHERE
Account = '' OR 1=1-- AND UserPassword = '' OR 1=1
  • 因為OR 1=1 恆為True,所以就能不需要帳號密碼登入網站
  • ‘OR 1=1 --,–目的在於清除後面的「’」

Solution

  • 不要透過+號串接SQL語法

Query Parameterization

對SQL語句進行參數化查詢 => SQL 會形成Excution paln =>不會執行不符合的Excution plan

  • 以Java來說,使用PreparedStatement取代Statement

reference