在node-oracledb中防止SQL注入

时间:2016-06-24 14:03:20

标签: javascript node.js oracle escaping sql-injection

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和大量predicates的组合。

2 个答案:

答案 0 :(得分:1)

驱动程序不会执行转义,数据库会执行转义,但仅限于使用绑定变量而不是字符串连接时。

您展示的示例是正确和安全的。

以下是一个如何使用WRONG方式进行SQL注入的示例:

CFBundleURLTypes

答案 1 :(得分:0)

要添加丹刚刚说的话,这里(或多或少) 正确的方式:

SQL查询字符串现在看起来像这样:

'INSERT INTO countries VALUES(?,?)'

(注意!引号中的问号!)

此SQL指定要插入的两个值是"参数。"因此,每次执行语句时,特定值必须"绑定到" 这两个参数。

SQL引擎将从绑定到它们的任何数据源"此时间直接直接检索每个参数的值。"因此,无论"它们碰巧包含什么(文本)," SQL永远不会认为它们是SQL语句本身的一部分。"

(所以,如果您偶尔发现countries表中的一列或另一列包含:"foo; drop table countries",那么毫无疑问他们会,你会知道... ; - ) 完全 做什么 ["很好的尝试,的失败者&#34!; ......] 行。)

编辑:正如Christopher Jones在回复此帖时所指出的那样,Oracle使用不同的语法来识别参数。然而,基本的想法仍然是相同的:提交给引擎的“SQL查询”包含调用输入值的规范,这些输入值必须在运行时提供每次执行语句。这些值完全独立于SQL语句本身,永远不会被误解为其中的一部分。使用您正在使用的任何SQL引擎调用的语法。