我正在使用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。
答案 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