今天,在我的引导营中,我们开始在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){})我的指导员并不总是最好的,但他被证明是非常有知识的,所以我相信这是有原因的。在过去,我们注意到他经常使用更古老的技术,这些技术已经被语言中最近的一些新技术所取代;这可能是他这样做的一个例子吗?
发布于 2022-04-28 01:39:56
直接插值样
`DELETE FROM foo WHERE id = ${bar}`这不是一个好主意,因为如果bar是动态生成的,比如从用户那里获取,这可能会导致SQL注入。见鲍比桌。
虽然理论上可以使用一个输入字符串,并尝试正确地对其进行消毒,然后自己直接插入结果--如果您搞砸了,您就会遇到麻烦。因此,数据库驱动程序通常提供一种不同的传入方式--可能是不可信的输入,因此所有这些都可以抽象到数据库驱动程序中--这使开发人员更加容易。这样,数据库驱动程序就可以实现它一次,而不是每个用户都必须实现它(并希望他们正确地实现它),而是让每个人都使用它。
对于这种特殊情况,mysql将分析传入的字符串,并将?替换为第二个参数的正确转义版本。
在过去,我们注意到他经常使用更古老的技术,这些技术已经被语言中最近的一些新技术所取代;这可能是他这样做的一个例子吗?
不,你在问题中展示的方法是非常正常和现代的。
发布于 2022-04-28 01:49:59
https://stackoverflow.com/questions/72036995
复制相似问题