Имя пользователя правильное, пароль неправильный? - PullRequest
0 голосов
/ 25 декабря 2010

В системе входа в систему, как вы можете определить, правильно ли пользователь ввел пароль?Выполняете ли вы два SQL-запроса, один для поиска имени пользователя, а затем другой для поиска имени пользователя и соответствующего (salted + hashed и т. Д.) Пароля?Я спрашиваю об этом, потому что если пользователь ввел пароль неправильно, я хочу обновить имеющийся у меня столбец failed_login_attempts.

Если вы выполните два запроса, это не увеличит накладные расходы?

Если вы сделали такой запрос, как бы вы узнали, был ли введен правильный пароль или нет, или имя пользователя не существует:

 SELECT * FROM author 
 WHERE username = '$username'
 AND password = '$password'
 LIMIT 1

(^ NB: IЯ сохраняю это простым, буду использовать хеш и соль и очистит входные данные в реальном.)

Примерно так:

$user = perform_Query() // get username and password?

 if ($user['username'] == $username && $user['password'] == $password)
 {
     return $user;
 }
 elseif($user['username'] == $username && $user['password'] !== $password)
 {   // here the password doesn't match
     // update failed_login_attemps += 1
 }

Ответы [ 5 ]

4 голосов
/ 25 декабря 2010

Ты слишком обдумываешь это. Требуется только один запрос:

SELECT * FROM author WHERE username = '$username';

Затем выполните:

if ($user['password'] == saltedHash($password,$user['salt'])) {
    return "successful";
}
else {
    return "failed";
}

Имя пользователя должно быть уникальным. В противном случае это не сработает. Я бы посоветовал не делать имя пользователя неуникальным, потому что это вызывает много других головных болей, кроме этого.

3 голосов
/ 25 декабря 2010

Если вы выполните два запроса, это не увеличит накладные расходы?

Я бы сказал, это не имеет значения на самом деле. Многие сложные веб-фреймворки выдают десятки или сотни запросов на запрос. Один более или менее ничего не изменит.

Я думаю, это действительно зависит от предпочтений. Насколько я понимаю, выборка всей пользовательской строки, а затем проверка пароля на стороне PHP наиболее целесообразны, поскольку у вас уже есть идентификатор, необходимый для обновления столбца failed_logins.

0 голосов
/ 26 декабря 2010

В вашем коде $ user будет пустым, если имя пользователя или пароль неверны

SELECT password = '$password' AS is_legit, * 
FROM author 
WHERE username = '$username'
LIMIT 1

$user = perform_Query() // get username and password?
// $user will be empty if the username is incorrect
$user_exists = $user.length > 0;
// to make sure we don't address a 
// non-existent array element
if($user_exists && $user['password'] == $password){ 
     return $user;
}
elseif($user_exists && $user['password'] !== $password)
{   // here the password doesn't match, but the user does
    // update failed_login_attemps += 1
    // be sure to let the user know that the penetration
    // attempt is halfway complete
}
else{
    // F4il
}
0 голосов
/ 25 декабря 2010

Способ ( и многие другие ) создания систем входа в систему таков:

  • При регистрации
    • создайте уникальный хэш и сохраните его вместе с именем пользователя,пароль
  • при входе в систему
    • Извлечение имени пользователя, пароля, хэша из базы данных
    • Использование предложения WHERE username = '$username'
    • Если есть 1строка, имя пользователя правильное
    • создайте скомпилированный хеш с hash($post_pass,$user_hash) и сравните с $ user_pass

Также, если вы возвращаете что-либо в 1 точке вашегоМетод any after не будет запущен, поэтому

if ($user['username'] == $username && $user['password'] == $password)
 {
     return $user;
 }
 elseif($user['username'] == $username && $user['password'] !== $password)
 {   // here the password doesn't match
     // update failed_login_attemps += 1
 }

можно изменить на

if ($user['username'] == $username && $user['password'] == $password)
{
    return $user;
}
return false

, потому что если ($user['username'] == $username && $user['password'] == $password) будет выполнено, то возврат будет выполняться дляfalse не будет выполнен.

Надеюсь, это поможет.

0 голосов
/ 25 декабря 2010

Мы выполняем один запрос, чтобы найти пользователя (на основе идентификатора пользователя), и выбираем UserId, PwSalt и PwHash.

Если пользователь не найден, мы знаем, что это недопустимое имя пользователя.

Если пользователь найден, мы хэшируем пароль и сравниваем его с pwHash из запроса.Если хеш не совпадает, мы обновляем неудачные попытки входа в систему.

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