使用转义字符“?”有什么意义?在 JavaScript 中构造 SQL 查询时而不是模板文字?
What is the point of using the escape character "?" instead of a template literal when constructing SQL queries in JavaScript?
今天在我的训练营中,我们开始在 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){})
我的导师并不总是最擅长指导,但事实证明他知识渊博,所以我相信这是有原因的。在过去,我们注意到他经常使用较旧的技术,这些技术在很大程度上已被最近添加到该语言中的技术所取代;这可能是他这样做的一个例子吗?
像直接插值
`DELETE FROM foo WHERE id = ${bar}`
是个坏主意,因为如果 bar
是动态生成的,例如从用户那里获取的,这可能会导致 SQL 注入。参见 Bobby Tables。
虽然理论上可以获取输入字符串并自己尝试对其进行正确清理,然后自己直接插入结果 - 如果搞砸了,就会有麻烦。因此,数据库驱动程序通常提供一种不同的方式来传递 possibly-untrusted 输入,因此所有这些都可以抽象到 数据库驱动程序 - 这使得它变得很多对开发人员来说更容易。这样一来,数据库驱动程序就可以一次实现它,而不是每个用户都必须实现它(并希望他们正确地实现它),然后让每个人都使用它。
对于这种特殊情况,mysql 将分析您传入的字符串并将 ?
s 替换为第二个参数的 正确转义 版本。
In the past we've noticed that he often uses older techniques that have been largely replaced by more recent additions to the language; is this maybe a case of him doing that?
不,您在问题中展示的方法非常正常和现代。
第一个参数映射到第一个问号。这个最小的变化确保了输入值被转义,因此,防止了这里的 SQL 注入攻击。
检查这个 post 我们为什么使用?在查询中。
What is the question mark's significance in MySQL at "WHERE column = ?"?
今天在我的训练营中,我们开始在 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){})
我的导师并不总是最擅长指导,但事实证明他知识渊博,所以我相信这是有原因的。在过去,我们注意到他经常使用较旧的技术,这些技术在很大程度上已被最近添加到该语言中的技术所取代;这可能是他这样做的一个例子吗?
像直接插值
`DELETE FROM foo WHERE id = ${bar}`
是个坏主意,因为如果 bar
是动态生成的,例如从用户那里获取的,这可能会导致 SQL 注入。参见 Bobby Tables。
虽然理论上可以获取输入字符串并自己尝试对其进行正确清理,然后自己直接插入结果 - 如果搞砸了,就会有麻烦。因此,数据库驱动程序通常提供一种不同的方式来传递 possibly-untrusted 输入,因此所有这些都可以抽象到 数据库驱动程序 - 这使得它变得很多对开发人员来说更容易。这样一来,数据库驱动程序就可以一次实现它,而不是每个用户都必须实现它(并希望他们正确地实现它),然后让每个人都使用它。
对于这种特殊情况,mysql 将分析您传入的字符串并将 ?
s 替换为第二个参数的 正确转义 版本。
In the past we've noticed that he often uses older techniques that have been largely replaced by more recent additions to the language; is this maybe a case of him doing that?
不,您在问题中展示的方法非常正常和现代。
第一个参数映射到第一个问号。这个最小的变化确保了输入值被转义,因此,防止了这里的 SQL 注入攻击。
检查这个 post 我们为什么使用?在查询中。
What is the question mark's significance in MySQL at "WHERE column = ?"?