Javascript 防止节点oracledb中的SQL注入

Javascript 防止节点oracledb中的SQL注入,javascript,node.js,oracle,escaping,sql-injection,Javascript,Node.js,Oracle,Escaping,Sql Injection,是否对查询进行转义/清理?它通过绑定将查询参数化: 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 " + res

是否对查询进行转义/清理?它通过绑定将查询参数化:

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);
  });
我查看了文档,快速地浏览了源代码,但没有任何地方说明或显示它逃避了查询


如果没有,我想在传递到
连接之前,结合使用大量的用户输入和查询。执行
方法。

驱动程序不执行转义,数据库执行转义,但只有在使用绑定变量而不是字符串串联时才执行

你展示的例子是正确和安全的

下面是一个示例,说明如何以错误的方式进行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刚才所说的内容,以下是(或多或少)正确的方法:

SQL查询字符串现在如下所示:

'INSERT INTO countries VALUES(?,?)'
(注意!引号中的问号是而不是

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

SQL引擎将直接从每个数据源绑定到它们的值,“此时”。因此,<强> >无论< /强>“它们包含什么(文本)”,SQL永远不会认为它们是“SQL语句的一部分,本身”。 (因此,如果您偶尔发现

国家/地区
表中的一列或另一列包含:
“foo;drop table countries”
,毫无疑问,它们会这样做,您将知道……;-)如何处理这些[“干得漂亮,失败者!”行。)



编辑:正如克里斯托弗·琼斯(Christopher Jones)在回复这篇文章时善意地指出的那样,Oracle使用不同的语法来识别参数。尽管如此,基本思想仍然是一样的:“SQL查询”,正如呈现给引擎的一样,包含调用输入值的规范,这些输入值必须在每次执行语句时提供。这些值完全独立于SQL语句本身,不会被错误地理解为SQL语句的一部分。使用您正在使用的任何SQL引擎所调用的语法。

事实上,“绑定参数”的声明目的是使任何包含的值都不可能被错误地解释为“SQL字符串的一部分”。您不必“清理”字符串,因为源代码中的字符串是唯一的服务器将接收的SQL字符串。当然,这并不能免除应用程序验证将要插入数据库的值的要求!确保它们不包含流氓内容,这将在随后检索和使用数据时产生问题。DB不会使用绑定变量进行任何“转义”。正如@MikeRobinson所解释的,不需要逃逸。数据库中存储的数据是用户希望存储的数据。Oracle不使用“?”表示绑定参数。它使用冒号名称或冒号语法,例如:“:country_id”或“:1”感谢您做出这一非常重要的澄清!我已经编辑了我的评论,将其包括在内。