Intereting Posts
Режим веб-приложений оставляет пользователей застрявшими, когда следующие ссылки на изображения при использовании WPTouch с W3 Total Cache Выполнить короткие коды при отправке сообщения HTML добавлен в редактор при удалении коротких кодов в браузере Chrome проверьте, удалено ли на сайте WordPress обновления Почему `url_to_postid` возвращает 0 при тестировании страницы` page_for_posts`? Первичная публикация, не работающая с wp_redirect с ошибкой «невозможно изменить информацию заголовка» Библиотека PHP, которая может объединять таблицу стилей с встроенным стилем запрос wpdb на пользовательскую таблицу не работает Как создать таблицу базы данных? Удалить титул страницы из статической страницы Проблема с Create Post с помощью metaWeblog.newPost или wp_insert_post Как получить имя термина post meta value, которое равно термина id Необязательный мета-запрос Количество показов новых участников, зарегистрированных сегодня Отображение состояния обмена в случае, если сообщение сохранено

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

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

Я установил плагин, и он сбросил весь пароль в базе данных WP, поэтому теперь все пароли для существующих пользователей пустые. Я создал новый пароль для своего личного пользователя. О других пользователях, могу ли я оставить пароль пустым в базе данных или это опасно? Я заметил, что если я попытаюсь войти с пустым паролем, логин в wordpress невозможен.

Solutions Collecting From Web of "Поле пароля пользователя пуст"

Я по-прежнему не рекомендую это, потому что он, вероятно, будет как-то использоваться …

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

Зачем…?

Когда вы пытаетесь войти в систему, используя форму, как показано на /wp-login./php , WordPress вызовет wp_authenticate_username_password() который подключен к действию authenticate .

wp_authenticate_username_password() проверяет, не является ли отправленный $password пустым. Если он пуст, он поднимет экземпляр WP_Error и запрос на вход будет отклонен.

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

Теперь, даже если вы wp_check_password() точке wp_authenticate_username_password() , пустой пароль все еще генерирует хеш-значение при пробеге через md5() , например md5('') //d41d8cd98f00b204e9800998ecf8427e .

Итак, что происходит, когда мы вводим wp_check_password() является то, что выполняется следующая логика …

Источник: wp-includes/pluggable.php

 function wp_check_password($password, $hash, $user_id = '') { global $wp_hasher; //note that... //$password = '' and $hash (from db) = '' // If the hash is still md5... if ( strlen($hash) <= 32 ) { $check = hash_equals( $hash, md5( $password ) ); // <- $check will return false, because the $hash is empty and does not match the hash of md5($password) if ( $check && $user_id ) { // Rehash using new hash. wp_set_password($password, $user_id); $hash = wp_hash_password($password); } /** * Filter whether the plaintext password matches the encrypted password. * * @since 2.5.0 * * @param bool $check Whether the passwords match. * @param string $password The plaintext password. * @param string $hash The hashed password. * @param int $user_id User ID. */ return apply_filters( 'check_password', $check, $password, $hash, $user_id ); } // If the stored hash is longer than an MD5, presume the // new style phpass portable hash. if ( empty($wp_hasher) ) { require_once( ABSPATH . WPINC . '/class-phpass.php'); // By default, use the portable hash from phpass $wp_hasher = new PasswordHash(8, true); } $check = $wp_hasher->CheckPassword($password, $hash); /** This filter is documented in wp-includes/pluggable.php */ return apply_filters( 'check_password', $check, $password, $hash, $user_id ); 

}

Итак, как только мы ударим:

 if ( strlen($hash) <= 32 ) { $check = hash_equals( $hash, md5( $password ) ); 

$check вернет false, потому что значение $hash является пустой строкой, а значение md5($password) которое по существу является md5('') равно d41d8cd98f00b204e9800998ecf8427e как я упоминал выше.

Поэтому попытка входа в систему будет отклонена.

Таким образом, в теории вы можете быть уверены, если какой-либо вредоносный код перехватывает:

return apply_filters( 'check_password', $check, $password, $hash, $user_id );

… и возвращает true . Но любой может сделать это при нормальных обстоятельствах, когда в базе данных существуют правильные хэши паролей.

Рекомендация:

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

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

Увидев, что маловероятно, что вы проверили каждый кусок внутреннего кода ядра, а также код из плагинов и, вероятно, свою тему, вы не знаете, когда или если пустые пароли возвратятся, чтобы укусить вас в заднице из-за того, который вводится в нулевой день.

Вместо…

 //you can use get_users() if you prefer instead of $wpdb directly... //this is just a one time operation.. don't forget to exclude those //users whom you do not wish to reset a password for, eg yourself global $wpdb; $users = $wpdb->get_col("SELECT ID FROM {$wpdb->prefix}users WHERE 1 = 1"); foreach ($users as $user_id) { wp_set_password(wp_generate_password(), $user_id); } 

… сделайте себе одолжение и установите пароли для всех пользователей и позвольте пользователю сбросить пароль или создать электронное письмо с ссылкой на сброс пароля.