這個問題在這里已經有了答案: es6 模板文字是否可以防止 sql 注入? (2 個回答) 4 小時前關閉。
今天在我的訓練營中,我們開始在 Node.js 中構建和運行 SQL 查詢。一旦我們涵蓋了基礎知識,我的教練就向我們展示了如何使用“?”。作為轉義字符,它應該以某種方式防止 SQL 注入。我想我明白了這個概念的要點,但我很困惑為什么要這樣做而不是將他們插入的任何變數放入模板文字中。例如:
db.query("DELETE FROM foo WHERE id = ?", [bar], function (err, result){})
對比
db.query(`DELETE FROM foo WHERE id = ${bar}`, function (err, result){})
我的導師并不總是最擅長指導,但事實證明他知識淵博,所以我相信這是有原因的。過去我們注意到他經常使用較舊的技術,這些技術在很大程度上已被該語言的最新添加所取代。這可能是他這樣做的一個例子嗎?
uj5u.com熱心網友回復:
直接插值
`DELETE FROM foo WHERE id = ${bar}`
是一個壞主意,因為如果bar是動態生成的,例如從用戶那里獲取,這可能會導致 SQL 注入。請參閱鮑比表。
雖然理論上可以獲取輸入字串并自己嘗試正確清理它,然后自己直接插入結果 - 如果你搞砸了,你會遇到麻煩。因此,資料庫驅動程式通常提供一種不同的方式來傳遞可能不受信任的輸入,因此所有這些都可以抽象到資料庫驅動程式中——這對開發人員來說更容易。這樣,資料庫驅動程式可以實作一次并讓每個人都使用它,而不是每個單獨的用戶都必須實作它(并希望他們正確地執行它) 。
對于這種特殊情況,mysql 將分析您傳入的字串并將?s替換為第二個引數的正確轉義版本。
過去我們注意到他經常使用較舊的技術,這些技術在很大程度上已被該語言的最新添加所取代。這可能是他這樣做的一個例子嗎?
不,您在問題中展示的方法非常正常和現代。
uj5u.com熱心網友回復:
第一個引數映射到第一個問號。這種最小的更改可確保輸入值被轉義,從而防止此處的 SQL 注入攻擊。
檢查這篇文章為什么我們使用?在查詢中。
問號在 MySQL 中“WHERE column = ?”的意義是什么?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466359.html
標籤:javascript mysql sql 节点.js
