【发布时间】:2019-06-22 12:48:18
【问题描述】:
如何防止sql注入。我有这个 sql 查询。
db.query('SELECT data FROM '+(server)+'.users WHERE user = 1');
【问题讨论】:
-
已经有一个关于那个的帖子:stackoverflow.com/a/15778841/7699045
标签: node.js
如何防止sql注入。我有这个 sql 查询。
db.query('SELECT data FROM '+(server)+'.users WHERE user = 1');
【问题讨论】:
标签: node.js
如果你使用 npm mysql 你可以使用 为了避免 SQL 注入攻击,在 SQL 查询中使用任何用户提供的数据之前,您应该始终对其进行转义。您可以使用 mysql.escape()、connection.escape() 或 pool.escape() 方法执行此操作:
var userId = 'some user provided value';
var sql = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);
connection.query(sql, function (error, results, fields) {
if (error) throw error;
// ...
});
或者,您可以使用?字符作为您希望像这样转义的值的占位符:
connection.query('SELECT * FROM users WHERE id = ?', [userId], function (error, results, fields) {
if (error) throw error;
// ...
});
【讨论】:
除了参数化查询和转义用户输入之外,养成的一个好习惯是立即验证路由器中的所有用户输入值,以确保您从用户那里得到预期的结果。如果您使用的是 express,express-validator 库对于验证输入非常方便。这是我修改的文档中的一个示例,以适用于您的问题:
const { check, validationResult } = require('express-validator');
app.post('/user', [
// server must be a valid database
check('server').isIn([... list of valid databases ...])
], (req, res) => {
// Finds the validation errors in this request and wraps them in an object with handy functions
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(422).json({ errors: errors.array() });
}
db.query('SELECT data FROM '+(req.body.server)+'.users WHERE user = 1');
});
【讨论】: