在MysQl nodeJS查询上转义数据数组的最佳方法

时间:2018-10-19 11:49:55

标签: javascript mysql node.js sql-injection

所以我有以下对象是由用户提交的数据进行注册的:

  var dataToInsert = { 
  userName: 'Wilson J',
  userEmail: 'WilsonJ@gmail.com',
  userAddress: '2020 St.',
  userCellPhone: '95587412',
  }

我正在使用以下查询将其插入:

 var insertQuery = `INSERT INTO users ( ${Object.keys(dataToInsert).toString()} ) VALUES( '${Object.values(dataToInsert).join("','")}' )`;

结尾处为:

INSERT INTO
  users (
    userName,
    userEmail,
    userAddress,
    userCellPhone
  )
VALUES
  (
    'Wilson J',
    'WilsonJ@gmail.com',
    '2020 St',
    95587412
  )

到目前为止,我很难理解数据转义的工作原理。如果有人能向我展示如何使用此代码进行SQL注入以及如何防止它,我将非常感激。

我正在使用MysQl npm模块,它具有以下方法:mysql.escape(),但我想找到一种更自动化的方法,而不是手动转义每个值。

2 个答案:

答案 0 :(得分:3)

在当今时代,除了将变量绑定到查询之外,不建议执行任何其他操作。有关其他转义数据方法的更多信息,请参见this

connection.query(`
    INSERT INTO users ( ${Object.keys(dataToInsert).toString()} ) VALUES (?)`, 
    Object.values(dataToInsert),
    function (error, results, fields) {
      if (error) throw error;
      // ...
    }
);

注意事项:您将无法将变量绑定到列名,因此不幸的是,该部分查询是必需的。确保dataToInsert的密钥是静态的,或者不是来自任何用户输入的密钥。

答案 1 :(得分:0)

  

或者,您可以使用?字符作为占位符,用作您要转义的值,例如:[...]

有一种方法。 https://github.com/mysqljs/mysql#user-content-escaping-query-values