【问题标题】:How to input a NodeJS variable into an SQL query如何将 NodeJS 变量输入到 SQL 查询中
【发布时间】:2020-05-20 00:06:21
【问题描述】:

我想编写一个包含 NodeJS 变量的 SQL 查询。当我这样做时,它会给我一个“未定义”的错误。

我希望下面的 SQL 查询能够识别 flightNo 变量。如何将 NodeJS 变量输入到 SQL 查询中?它周围是否需要特殊字符,例如$?

app.get("/arrivals/:flightNo?", cors(), function(req,res){
var flightNo = req.params.flightNo;

connection.query("SELECT * FROM arrivals WHERE flight = 'flightNo'", function(err, rows, fields) {

【问题讨论】:

    标签: sql node.js node-mysql


    【解决方案1】:

    您需要将变量的放入 SQL 语句中。

    这不好:

    "SELECT * FROM arrivals WHERE flight = 'flightNo'"
    

    这会起作用,但它对 SQL 注入攻击并不安全:

    "SELECT * FROM arrivals WHERE flight = '" + flightNo + "'"
    

    为了避免 SQL 注入,您可以像这样转义您的值:

    "SELECT * FROM arrivals WHERE flight = '" + connection.escape(flightNo) + "'"
    

    但最好的方法是使用参数替换:

    app.get("/arrivals/:flightNo", cors(), function(req, res) {
      var flightNo = req.params.flightNo;
    
      var sql = "SELECT * FROM arrivals WHERE flight = ?";
      connection.query(sql, flightNo, function(err, rows, fields) {
      });
    });
    

    如果要进行多个替换,请使用数组:

    app.get("/arrivals/:flightNo", cors(), function(req, res) {
      var flightNo = req.params.flightNo;
      var minSize = req.query.minSize;
    
      var sql = "SELECT * FROM arrivals WHERE flight = ? AND size >= ?";
      connection.query(sql, [ flightNo, minSize ], function(err, rows, fields) {
      });
    });
    

    【讨论】:

    • 即使我想使用“INSERT INTO table”命令,我也应该使用 connection.escape 吗?所以应该是这样的:"INSERT INTO table VALUES('" + connection.escape(flightNo) + "'")"
    • 您应该在每个查询中防止 SQL 注入。最好使用connection.query('INSERT INTO table VALUES (?)', flightNo, function(err, result) { });
    • 这是怎么做的: var sql = "INSERT INTO admins VALUES(null, '" + adminUser +"', '" + adminPass + "', '" + adminName + "' , '"+ 管理员姓氏 +"') "; con.query(sql,function(error, rows, fields){ if(!!error) { console.log('查询失败' + error.message); } else { console.log('查询成功'); 控制台.log(rows.insertId); next(); } });
    • @ChristosMichael 你应该逃避这些价值观。我会用参数替换来做到这一点:codeshare.io/2WbdvY
    • IBM_DB 要求参数是一个数组,即使只有一个。
    【解决方案2】:

    如果你使用的是> ES6:

    connection.query(`SELECT * FROM arrivals WHERE flight = ${flightNo}`, function(err, rows, fields) {
    

    如果你是

    connection.query("SELECT * FROM arrivals WHERE flight = " + flightNo, function(err, rows, fields) {
    

    请注意,这是非常糟糕的做法,因为您将容易受到 SQL 注入攻击。

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      相关资源
      最近更新 更多