【问题标题】:What is the correct syntax for replacements within a SQL stringSQL 字符串中替换的正确语法是什么
【发布时间】:2020-10-27 02:12:05
【问题描述】:

我正在尝试使用此 JavaScript 在我的 sqlite3 数据库中进行基本搜索:

function search(query) {
  let sql = `SELECT * from tracks WHERE title LIKE '%${query}%'`

  db.sqlite.all(sql, [], (err, rows) => {
    console.log(rows)
  })
}

这可行,但容易受到 SQL 注入的攻击。我正在尝试使 sqlite 替换参数起作用,但我无法正确使用语法。 Sqlite 不想替换字符串文字中的任何内容。

// throws SQLITE_RANGE error
let sql = `SELECT * from tracks WHERE title LIKE '%$query%'`
db.sqlite.all(sql, {$query: query}, (err, rows) => {})

编写此代码的正确方法是什么,使其不易受到 SQL 注入的影响?

【问题讨论】:

  • 我的第一次搜索尝试在这里登陆:stackoverflow.com/questions/51997182/… 可以在哪里找到解决方案... LIKE ${query} ...在问这里问题之前先搜索怎么样 ;-)?跨度>
  • 不要将 qoutes 和百分号放在参数名称周围,例如 '%$query%' 应该只是 $query、sqlite module docs
  • @BitLauncher 您的链接仅涵盖安全输入,因此对我不起作用。
  • @PatrickEvans 这确实有效,但我如何使它与 %'s 一起工作?
  • 它们需要成为query 本身的值的一部分,例如query = '%yourvalue%'

标签: javascript sql node.js sqlite


【解决方案1】:

我想通了

let sql = `SELECT * from tracks WHERE title LIKE '%' || $query || '%'`

【讨论】:

    【解决方案2】:

    这些是什么||为了? SQLite 专业?是的,这是一种在 SQL 中连接字符串的方法——我不知道任何其他使用它的 DBMS。所以这个解决方案只适用于 SQLite,但 AFAIK 不适用于 MySql、Oracle、Transact SQL,......它不是标准 SQL。

    我认为用|| 很难知道这个技巧。 恕我直言,有一种更易于理解的方法,每个开发人员都很容易理解:

    我会首先更改变量的值,然后将其作为参数传递给查询,这样代码应该是可读的 - 请原谅我的任何疏忽,因为我不是 Javascript 破解者:

    function search(query) {
      let likePattern = `%${query}%` // or in the very old days = '%' + query + '%'
      let sql = `SELECT * from tracks WHERE title LIKE $likePattern`
    
      db.sqlite.all(sql, {$likePattern: likePattern}, (err, rows) => {})
    }
    

    PS:有人已经在问题的 cmets 中提出了这个想法,所以如果有人对此表示赞同,那么也为其他人的评论点赞。

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 2019-09-13
      • 1970-01-01
      • 2018-11-14
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多