SQL注入是對於使用SQL查詢的基於數據庫的應用程序而言的最大威脅之一,並且與輸入數據消毒聯繫在一起。
假設我們使用Node.js運行這樣一個簡單的查詢(這裡使用偽代碼):
const color = //來自用戶輸入
const query = `select * from cars where color = '${color}'`
如果color
是一個包含顏色(如red
或blue
)的字符串,一切正常運作。
但是如果你接受來自表單中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"
這將導致用戶表被刪除。
我們可以通過正確的對輸入進行消毒、對引號進行轉義,以及使用像Prisma、Sequelize(JavaScript)或Eloquent(Laravel)這樣的合適的ORM,而不是直接執行SQL查詢來解決這個問題。