Node JS SQL 防止sql注入
Posted
技术标签:
【中文标题】Node JS SQL 防止sql注入【英文标题】:Node JS SQL prevent sql injection 【发布时间】:2019-06-22 12:48:18 【问题描述】:如何防止sql注入。我有这个 sql 查询。
db.query('SELECT data FROM '+(server)+'.users WHERE user = 1');
【问题讨论】:
已经有一个关于那个的帖子:***.com/a/15778841/7699045 【参考方案1】:如果你使用 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;
// ...
);
【讨论】:
有没有办法编写中间件来防止NodeJS中的SQL注入 Yours 是我能找到的唯一答案,它可以防止 SQL 注入变量查询,即字段和值随用户输入而变化的查询。如果您使用相同的脚本(甚至是相同的查询变量)对用户名、电子邮件和密码等表单数据进行后端验证或注册/登录,这将非常有用。【参考方案2】:除了参数化查询和转义用户输入之外,养成的一个好习惯是立即验证路由器中的所有用户输入值,以确保您从用户那里得到预期的结果。如果您使用的是 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');
);
【讨论】:
以上是关于Node JS SQL 防止sql注入的主要内容,如果未能解决你的问题,请参考以下文章