MySql, NodeJS, ExpressJS и bcrypt: как лучше всего обрабатывать логин пользователей? - PullRequest
0 голосов
/ 15 октября 2019

Мое решение работает, но я не уверен, что это безопасно и уместно. На внешнем интерфейсе у меня есть приложение ReactJS, которое отправляет вместе с axios запрос с логином и паролем. На заднем плане у меня есть NodeJS + ExpressJS, обрабатывающий запрос следующим образом:

router.post('/', function(req, res, next) {
  // get the records that match the login provided
  const sql = "SELECT name, surname, login, password, blocked FROM users WHERE login=?";
  query(sql, [req.body.login])
  .then((result)=> {
    // if there are 1 or more results, compare the passwords with bcrypt
    if (result.length > 0) {
      bcrypt.compare(req.body.password, result[0].password, function(err, success) {
        if (success) {
          // if the user is not blocked, send the status 200 with user's data
          result[0].blocked ?
            res.status(401).json({type: 'Warning', message: 'Your account has been blocked. Plase contact the admins.'})
            :
            res.status(200).json({name: result[0].name, surname: result[0].surname, email: result[0].email});
        } else {
          // send an error if the password is wrong
          res.status(401).json({type: 'Error', message: 'Please check that your login and password are correct.'});
        } 
      });
    } else {
      // send an error if the login was not found
      res.status(401).json({type: 'Error', message: 'Please check that your login and password are correct.'});
    }
  }); 

});

Достаточно ли / безопасно ли запрашивать базу данных для предоставленного логина (он уникален) с помощью if (result.length > 0)?

Можно ли, чтобы в ответе сервера содержалось сообщение об ошибке, подобное этому?

res.status(401).json({type: 'Warning', message: 'Your account has been blocked. Plase contact the admins.'})

У меня есть возможность сообщить пользователю, что он ввел правильный логин, но неверный пароль;я должен дать ему знать это? Я думаю, что это дало бы злоумышленникам знание о том, что логин действительно существует, поэтому сейчас я просто отправляю общую ошибку login / pwd. Это нормально?

Можно ли отправлять данные пользователя с сервера клиенту, если вход был успешным?

1 Ответ

1 голос
/ 15 октября 2019

Это нормально, чтобы сообщение об ошибке содержалось в ответе сервера, как это?

У меня есть возможность сообщить пользователю, если он набрал правильный логин, нонеправильный пароль;я должен дать ему знать это? Я думаю, что это дало бы злоумышленникам знание о том, что логин действительно существует, поэтому сейчас я просто отправляю общую ошибку login / pwd. Это нормально?

Ваша реализация достаточно хороша. Это также хорошая практика, позволяющая пользователям знать, почему они не могут войти в систему, не выдавая слишком много информации ДАЖЕ, когда возникает проблема с предоставленными учетными данными (что вы уже делаете).

Достаточно ли этого /безопасно запросить базу данных для предоставленного логина (он уникален) с помощью if (result.length> 0)?

  • Да, это тоже хорошо. Вы также можете добавить LIMIT 1 к вашему запросу, чтобы немного повысить производительность, поскольку нет смысла сканировать вашу БД по всем записям, когда вы ожидаете только один результат.

Этотакже рекомендуется отправлять только минимальный объем информации и запрашивать дополнительную информацию по запросу.

Как общее наблюдение за вашим кодом, вы бы выиграли от следующего:

  • Выполнение некоторой проверки ошибок в вашем объекте запроса перед тем, как вообще выполнить запрос к базе данных (хорошая практикатакже) поскольку нет гарантии, что действительное или правильно отформатированное имя пользователя / пароль будет отправлено вместе с запросом.

  • Перемещение ответов в другой файл, чтобы сделать ваш код более понятным и поддерживаемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...