在节点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引擎调用的语法。