使用LIKE运算符时如何防止SQL注入?

时间:2015-06-02 09:38:03

标签: 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注入?

我试过

  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。

1 个答案:

答案 0 :(得分:1)

尝试永远不要通过连接构建sql请求。它确实总是增加SQL注入足迹的风险。

占位符应该在LIKE条件下工作。

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

准备好的声明甚至会更好地解决安全问题。你应该阅读https://github.com/felixge/node-mysql/#escaping-query-values