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注入的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在没有准备好的语句(Node.js 和 MSSQL)的情况下防止 SQL 注入

node-mysql中防止SQL注入

MyBatis怎么防止SQL注入

node防止sql注入 xss攻击和密码加密

MyBatis怎么防止SQL注入

如何彻底防止SQL注入?