mysql - 使用 LIKE 运算符时如何防止 SQL 注入(inject)?

标签 mysql sql node.js sql-injection node-mysql

我正在使用 Node 和 node-mysql 构建一个网站包。

app.get('/api/tags', function(req, res) {
  var term = req.query.term;
  var query =
  'SELECT \
     t.tagName \
   FROM tags t \
   JOIN screencastTags st \
     ON st.tagName = t.tagName \
   JOIN screencasts s \
     ON s.screencastId = st.screencastId \
   WHERE s.status = \'approved\' AND t.tagName LIKE \'%' + term + '%\' \
   GROUP BY t.tagName \
   LIMIT 5';
  connection.queryAsync(query).spread(function(tags) {
    tags = tags.map(function(tag) { return tag.tagName });
    res.send(tags);
  })
})

这里我使用查询字符串中的值 - term - 返回标签列表。

我的问题是:使用 LIKE 运算符时如何防止 SQL 注入(inject)?

我试过了

  var query =
  'SELECT \
     t.tagName \
   FROM tags t \
   JOIN screencastTags st \
     ON st.tagName = t.tagName \
   JOIN screencasts s \
     ON s.screencastId = st.screencastId \
   WHERE s.status = \'approved\' AND t.tagName LIKE \'%' + conneciton.escape(term) + '%\' \
   GROUP BY t.tagName \
   LIMIT 5';

但这会产生无效的 SQL。

最佳答案

尽量不要通过串联构建 SQL 请求。它确实总是增加 SQL 注入(inject)足迹的风险。

即使在 LIKE 条件下,占位符也应该起作用。

var sql = '... LIKE ? GROUP BY ...';
connection.query(sql, ['%' + term + '%'], function(err, res) {})

出于安全考虑,准备好的声明甚至会更好。你应该阅读https://github.com/felixge/node-mysql/#escaping-query-values

关于mysql - 使用 LIKE 运算符时如何防止 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30592446/

相关文章:

mysql - 加入与 mySQL 中的其他方法

mysql - 从现有的 MySql 数据库创建 SQL Server 数据库

javascript - 使用流异步读取文件时如何同步处理每一行/缓冲区

JavaScript 简化器?

mysql - 在 hdfs 中进行选择的最佳方法?

mysql 查询显示不正确的行

永远在线的PHP进程

php - Mysql汇总所有包含两列之一中的值的行

mysql - 学习 SQL Server 2008 和存储过程

node.js - Node.js 中同步获取 url?