什麼是 SQL Injection?該如何避免?

2023年2月9日

💎 加入 E+ 成長計畫 與超過 250+ 位軟體工程師一起在社群中成長,並且獲得更深入、系統性軟體工程內容

什麼是 SQL Injection?

SQL Injection 是透過修改 SQL 語句,進而達到對資料庫的惡意攻擊,常見的方法為,用戶填寫的表格中,刻意填寫 SQL 語句,使得後端獲得文字後,用拼接的方式可能會得到意想不到的 SQL 語句,並且對資料庫做執行,如下圖所示。

SQL Injection
SQL Injection

因此用戶只要在 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 的問題。


相關文章

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們