Проверка пароля пользователя

30 мар. 2011 г., 23:11:28
Просмотры: 32.1K
Голосов: 6

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

Копаясь в коде, я обнаружил, что функция устанавливает пароль, используя новый хеш. Более того, если я использую wp_check_password( 'hello', md5('hello'), 1 );, она даже не проверяет, что находится в базе данных, и возвращает true. Разве это не ошибка?

Есть ли идеи, как я могу проверить пароль пользователя?

0
Все ответы на вопрос 3
10
14

Ваш пример работает корректно. Вы проверяете, соответствует ли пароль hello хешу hello — что естественно верно.

Не до конца продумал. Ваш пример вызывает следующую проблему:

  1. Вы проверяете, соответствует ли hello md5 от hello (вместо хеша из профиля пользователя).
  2. Они совпадают, и WordPress считает это верным, но устаревшим md5 хешем — который необходимо обновить.
  3. Он повторно хеширует hello и обновляет пользователя этим значением, блокируя его (поскольку теперь его пароль — это hello вместо того, что был ранее).

Смотрите функцию wp_authenticate_username_password() для подробного примера, но основная идея такова:

$userdata = get_user_by('login', $username);
$result = wp_check_password($password, $userdata->user_pass, $userdata->ID);
30 мар. 2011 г. 23:23:59
Комментарии

Но это работает не во всех случаях, что, как я предположил, и было проблемой. Во-первых, функция хеширования пароля является заменяемой (pluggable), поэтому она не обязательно использует md5 (на самом деле, по умолчанию, кажется, используется phpass).

goldenapples goldenapples
30 мар. 2011 г. 23:45:09

@goldenapples не имеет смысла переопределять wp_hash_password() и оставлять без изменений wp_check_password(). Несовпадение хешей просто не позволит пройти проверку, верно? :)

Rarst Rarst
30 мар. 2011 г. 23:49:49

О, ты прав. wp_check_password() будет работать так, как ты использовал её в своём ответе. Я говорил про его исходный вопрос — проверку 'hello' против md5 от 'hello', которая не сработает, если md5 не является алгоритмом, используемым в wp_hash_password...

goldenapples goldenapples
30 мар. 2011 г. 23:55:00

@goldenapples нативная функция wp_hash_password() действительно поддерживает md5 для обратной совместимости, она перехэширует такие пароли при проверке. Теперь, когда я об этом задумался, скорее всего в исходном вопросе проблема именно в этом...

Rarst Rarst
31 мар. 2011 г. 00:03:01

Да, если два введенных пароля совпадают при использовании md5, wp_check_password сбросит пароль пользователя, используя текущую хэш-функцию. Поэтому в исходном вопросе, так как введенные пароли совпадали, он менял пароль пользователя на "hello"...

goldenapples goldenapples
31 мар. 2011 г. 00:05:28

@Rarst Спасибо! Это работает. А я все думал, почему мне нужно самому передавать хэш. Это сделано для поддержания обратной совместимости, верно? Иначе достаточно было бы просто пароля для проверки и ID.

Ashfame Ashfame
31 мар. 2011 г. 00:08:07

@Ashfame функции, связанные с паролями, намеренно сделаны подключаемыми и очень гибкими, чтобы люди могли легко создавать или интегрировать альтернативные схемы аутентификации.

Rarst Rarst
31 мар. 2011 г. 00:11:24

@Rarst То есть это сделано для обеспечения возможности подключения, а не для поддержания обратной совместимости с разными хешами?

Ashfame Ashfame
31 мар. 2011 г. 00:13:05

@Ashfame обратная совместимость есть только с md5, потому что именно это использовалось в WordPress в прошлом.

Rarst Rarst
31 мар. 2011 г. 00:14:45

@Rarst Да! Именно это я и имел в виду. Я подумал, что ваше упоминание о возможности подключения также связано с причиной принятия самого хэша в качестве аргумента.

Ashfame Ashfame
31 мар. 2011 г. 00:41:45
Показать остальные 5 комментариев
2

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

Чтобы проверить, совпадает ли пароль текущего пользователя со строкой "hello", используйте следующий код:

if ( $current_user->user_pass == wp_hash_password( 'hello' ) )
30 мар. 2011 г. 23:18:51
Комментарии

if ( wp_hash_password( $xx_new_password ) != $xx_userinfo->user_pass ) работает иначе, чем if ( !wp_check_password( $xx_new_password, $xx_userinfo->user_pass , $xx_id ) ) Странно! Спасибо за помощь!

Ashfame Ashfame
31 мар. 2011 г. 00:10:57

Это неверно. wp_hash_password() применяет (в 2020 году) случайную "соль" к паролю перед хешированием, поэтому никакие два вызова этой функции не возвращают одинаковое значение.

O. Jones O. Jones
23 окт. 2020 г. 00:07:52
0
require_once ABSPATH . WPINC . '/class-phpass.php';
$wp_hasher = new PasswordHash(8, TRUE);

$password_hashed = '$P$BB3pP6fQAYa61ael0LNQlpB1NOyqNY0';
$plain_password = 'admin2';
if($wp_hasher->CheckPassword($plain_password, $password_hashed)) {
    print 'Пароль совпал.';
}

Кредиты: https://stackoverflow.com/a/37181662

28 мая 2022 г. 02:34:45