SQL注入是對於使用SQL查詢的基於數據庫的應用程序而言的最大威脅之一,並且與輸入數據消毒聯繫在一起。

假設我們使用Node.js運行這樣一個簡單的查詢(這裡使用偽代碼):

const color = //來自用戶輸入
const query = `select * from cars where color = '${color}'`

如果color是一個包含顏色(如redblue)的字符串,一切正常運作。

但是如果你接受來自表單中input字段的字符串,並且攻擊者輸入字符串"blue';drop table cars;",你看到發生了什麼嗎?

現在query的值是:

select * from cars where color = 'blue';drop table cars;'

如果你執行這個查詢,除非你在數據庫使用者的權限中移除了刪除表的選項,否則這將刪除所有數據。

再舉個例子。

假設你執行這樣一個查詢:

const query = 'SELECT * FROM users where name = "' + name + '"'

如果你接受來自表單的name變量,並且沒有對其進行消毒,有人可能輸入以下值:

flavio"; DELETE * FROM users; SELECT * FROM users where name ="flavio

看到了嗎?現在查詢變成了:

SELECT * FROM users where name = "flavio"; DELETE * FROM users; SELECT * FROM users where name ="flavio"

這將導致用戶表被刪除。

我們可以通過正確的對輸入進行消毒、對引號進行轉義,以及使用像PrismaSequelize(JavaScript)或Eloquent(Laravel)這樣的合適的ORM,而不是直接執行SQL查詢來解決這個問題。