这种方法对 SQL 注射安全吗?

Is this approach safe to SQL Injections?

我有以下代码可以使用 MySQL 查询从 Express.js 中的数据库中检索数据。我曾经在 vanilla HTML、JS、PHP... 上开发...现在我在后端使用 React 和 Express.js,这两种语言对我来说是一个新世界。我想知道的是,进行这样的查询是否安全。

非常感谢,感谢您的帮助。

const db = mysql.createConnection({
  host: process.env.DATABASE_HOST,
  user: process.env.DATABASE_USER,
  password: process.env.DATABASE_PASSWORD,
  database: process.env.DATABASE_NAME
});

exports.sesion = async (req, res) => {

  console.log(req.body);

  try {   
    const { email, password } = req.body[0];

    if(!email || !password) {
      res.json({
        message: 'Por favor introduzca su email y contraseña'
      })
    }

    db.query('SELECT * FROM usuarios WHERE email = ?', [email], async (error, filas, fields) => {
      
      if(filas.length === 0) {
        res.json([
          {message: 'Los datos ingresados son incorrectos'}
        ])
      }
      else if(filas && !(await bcrypt.compare(password, filas[0].password))) {
        res.json([
          {message: 'Los datos ingresados son incorrectos'}
        ])
      }
      else {
        res.json([
          {message: 'Inicio de sesión correcto'}
        ])
      }
    })

  }
  catch (error) {
    console.log(error);
  }
  
}

这应该是安全的,因为如果作为参数传递,mysql 包会对其进行转义。还有更详细的方法可以做到这一点:你可以在这里看到它们:https://github.com/mysqljs/mysql#escaping-query-values.

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;
  // ...
});```

是的,这是安全的。您参数化了用户的输入,因此可以安全地防止 SQL 注入。

为了更加安全,您可以使用专门为此目的设计的大量正则表达式之一来验证来自用户的电子邮件,例如这个。 https://emailregex.com/