什麼是 SQL Injection?該如何避免?
2023年2月9日
💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源
什麼是 SQL Injection?
SQL Injection 是透過修改 SQL 語句,進而達到對資料庫的惡意攻擊,常見的方法為,用戶填寫的表格中,刻意填寫 SQL 語句,使得後端獲得文字後,用拼接的方式可能會得到意想不到的 SQL 語句,並且對資料庫做執行,如下圖所示。
因此用戶只要在 password
的欄位填寫 ' OR 1 = 1 --
使得字串拼接起來為
queryStr = """ SELECT * FROM users WHERE username = 'Jack' AND password = '' OR 1= 1 --';"
因為 username = 'Jack' AND password = '' OR 1 = 1
恆為 True
,因此不用密碼也能夠登入成功。
如何防範 SQL Injection ?
Escape Parameters
利用正規表達式,對用戶輸入的參數進行檢查,如果有符合 SQL 語句的關鍵字,就將他替換成合法字元,但這個方法的缺點為,若 SQL 語法關鍵字一旦新增,則正規表達式的規則也需要新增;而且總是會有漏網之魚,無法全面防範。
Query Parameterization
這個防範是最安全的,原理就是資料庫語法中的佔位符號:
SELECT * FROM users WHERE username = $1 AND password = $2 ;
有些程式語言會先將 SQL 語句進行編譯,最後再將參數丟入做執行,因此可以有效防範 SQL Injection 的攻擊。
Object Relational Mapping (ORM)
使用 ORM 而非原始的 SQL 語句可以直接避免掉 SQL Injection 的問題。