【问题标题】:Node JS SQL prevent sql injectionNode JS SQL 防止sql注入
【发布时间】:2019-06-22 12:48:18
【问题描述】:

如何防止sql注入。我有这个 sql 查询。

db.query('SELECT data FROM '+(server)+'.users WHERE user = 1');

【问题讨论】:

标签: node.js


【解决方案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');
});

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 2011-06-12
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2013-08-31
    • 2019-06-03
    • 2015-09-07
    相关资源
    最近更新 更多