【问题标题】:Avoid injection in SQL LIKE query in Node js避免在 Node js 中注入 SQL LIKE 查询
【发布时间】:2020-11-21 03:43:05
【问题描述】:

就这个话题提出了几个问题。但我在任何地方都找不到确切的答案。 下面的代码会导致sql注入吗?如果是,如何逃脱?

db.query('SELECT USER.id, USER.username FROM USER LEFT JOIN user_photo photo ON USER.id = photo.user_id WHERE USER.username LIKE "%' + search + '%"', (err, result) => {
   if (err) throw err
   res.send(result)
})

我用mysql.escape() 尝试了下面的代码。但是在这种情况下 SQL 查询不起作用:

db.query('SELECT USER.id, USER.username FROM USER LEFT JOIN user_photo photo ON USER.id = photo.user_id WHERE USER.username LIKE "%' + mysql.escape(search) + '%"', (err, result) => {
   if (err) throw err
   res.send(result)
})

【问题讨论】:

  • 尝试替换,大多数图书馆都有。最安全的方法是参数化查询,但当然更慢。
  • 您希望它如何工作?
  • @AnonyMouze,参数化查询更慢?你测量过这个吗?
  • @BillKarwin 不确定数据库的执行情况,但在我使用的大多数语言中进行参数化查询都有额外的步骤。所以逻辑上比较慢。
  • 在实践中,差异远小于查询执行时间。这不是避免使用参数化查询的好理由。

标签: mysql node.js security sql-injection


【解决方案1】:

您可以像这样在传递给查询的参数中指定 LIKE 模式,该参数将被安全地转义,如文档中的 here

let search = "Terry";

let sql = `SELECT USER.id, USER.username FROM USER 
           LEFT JOIN user_photo photo 
           ON USER.id = photo.user_id WHERE USER.username LIKE ?`;

db.query(sql, [`%${search}%`], (err, result) => {
    if (err) throw err
    res.send(result);
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    相关资源
    最近更新 更多