我正在使用 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/