Node.js:防止 SQL 查询来自 SQL 注入

Node.js: Preventing SQL Queries from SQL Injections

我正在使用 AWS Lambda 和 API 网关开发 REST API Node.js。我正在使用 MySQL 数据库。我是 Java 人,对 Node.JS 还很陌生。刚满一天。

我意识到有多种方法可以防止 Node.js 中的 SQL 注入。下面是我的代码

const mysql = require('mysql');
const PropertiesReader = require('properties-reader');

const prop = PropertiesReader('properties.properties');

const con = mysql.createConnection({
  host     : prop.get('server.host'),
  user     : prop.get("server.username"),
  password : prop.get("server.password"),
  port     : prop.get("server.port"),
  database : prop.get("server.dbname")
});


exports.getRoleByID = (event, context, callback) => {

  const { id } = event.queryStringParameters;
  console.log("id", id);

  // allows for using callbacks as finish/error-handlers
  context.callbackWaitsForEmptyEventLoop = false;
  const sql = "select * from role where idrole = ?";
  con.query(sql, [id], function (err, result) {
    if (err) throw err;

    var response = {
      "statusCode": 200,
      "headers": {
        "Content-Type": "application/json"
      },
      "body": JSON.stringify(result),
      "isBase64Encoded": false
    };
    callback(null, response)
  });
};

如您所见,我正在使用 ? 应用 SQL 注入保护。但我也注意到,做这样的事情会给予保护

var sql    = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);

使用哪种方式来保护代码免受 SQL 注入?我用的方式还是connetion.escape()的方式?或者其他方式?

使用 ? 占位符更易于读写,并且可能会提供更高的性能,因为参数可以更有效地编码(例如,数字可以作为二进制表示形式通过网络发送,而不是字符串)。