节点JS SQL防止SQL注入

时间:2019-01-29 11:40:50

标签: node.js

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

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

2 个答案:

答案 0 :(得分:0)

如果您使用的是npm mysql,则可以使用 为了避免SQL注入攻击,在SQL查询中使用任何用户提供的数据之前,应始终对其进行转义。您可以使用mysql.escape(),connection.escape()或pool.escape()方法来实现:

varuserId =='某些用户提供的值';

var sql ='SELECT * FROM用户WHERE id ='+ connection.escape(userId);

connection.query(sql,function(error,results,fields){

如果(错误)抛出错误;

// ...

});

或者,您可以使用?字符作为占位符,代表您希望这样逃避的值:

connection.query('SELECT * FROM users.WHEREid =?'',[userId],函数(错误,结果,字段){

如果(错误)抛出错误;

// ...

});

答案 1 :(得分:0)

除了参数化查询和转义用户输入外,要养成的一个好习惯是立即验证路由器中的所有用户输入值,以确保您能从用户那里得到期望。如果您使用的是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');
});