在节点oracledb中防止SQL注入
node-oracledb是否逃避/清理查询? 它通过绑定参数化查询:
connection.execute( "INSERT INTO countries VALUES (:country_id, :country_name)", [90, "Tonga"], function(err, result) { if (err) console.error(err.message); else console.log("Rows inserted " + result.rowsAffected); });
我查看了文档,并通过源代码快速准备好了,但是没有任何地方也没有表明它逃避了查询。
如果没有,我正在考虑在传递给connection.execute
方法之前,使用node-mysql以及用户input和查询的丰富谓词的组合。
驱动程序不会进行转义,数据库也会这样做,但仅当您使用绑定variables而不是string连接时。
你展示的例子是正确和安全的。
下面是一个如何做到错误的例子,它可以打开你的SQL注入:
connection.execute( "INSERT INTO countries VALUES (" + countryId + ",'" + countryName + "')", function(err, result) { if (err) console.error(err.message); else console.log("Rows inserted " + result.rowsAffected); });
为了补充Dan刚才所说的,这里(或多或less)是什么才是正确的方法:
SQL查询string现在看起来像这样:
'INSERT INTO countries VALUES(?,?)'
(注意问号不在引号内!)
此SQL指定要插入的两个值是“参数”。 因此,具体的值必须“绑定”这两个参数,每次执行语句。
SQL引擎将直接从任何数据源绑定到它们的“这次 ”检索每个参数的值。 因此, 无论 “它们碰巧包含什么(文本)”,SQL都不会认为它们是“SQL语句本身的一部分”。
(所以,如果偶然发现在你的countries
表中有一列或另一列包含: "foo; drop table countries"
,毫无疑问,他们将会知道…… 😉 究竟是什么与那些[“不错的尝试, 失败者! ”]行] 。
编辑:正如克里斯托弗·琼斯在这篇文章的回复中指出的,Oracle使用不同的语法来确定参数。 尽pipe如此,基本思想仍然是一样的:提供给引擎的“SQL查询”包含了调用input值的规范,这些input值必须在运行时提供,每次执行语句时都要提供。 这些值完全独立于SQL语句本身,不会被误解为其中的一部分。 使用您正在使用的任何SQL引擎调用的语法。