Сброс пароля в WordPress 2.5.1

Vladimir
Опубликовано в: Патчи

Патч, решающий проблему сброса пароля в WordPress 2.5.1

У WordPress 2.5.1 есть одна весьма нехорошая ошибка: не работает сброс пароля. При попытке сброса WordPress выдает следующую ошибку: «Sorry, that key does not appear to be valid». Данная ошибка исправлена в dev-версии WordPress 2.5.2.

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

Проблема возникает из-за двух особенностей (читай: ошибок):

  1. Случайно генерируемый пароль содержит специальные символы !@#$%^&*(), вследствие чего ссылка с кодом для сброса пароля воспринимается неправильно (почтовики воспринимают ссылку лишь частично — забыли разработчики прогнать сгенерированный пароль через urlencode()).
  2. Вторая ошибка гораздо серьёзнее: рассмотрим, почему. Допустим, пришло письмо с ссылкой на wp-login.php?action=rp&key=hX(ZLKYR)*gl. WordPress вызовет reset_password("hX(ZLKYR)*gl"), а в функции reset_password() есть такая замечательная строка:
    [-]
    View Code PHP
    1. $key = preg_replace('/[^a-z0-9]/i', '', $key);

    Иными словами, всё, что не цифра и не буква английского алфавита, будет удалено. Код активации примет вид hXZLKYRgl и будет сравниваться с кодом, который хранится в базе данных (hX(ZLKYR)*gl). Очевидно, что они не совпадут, и мы увидим сообщение об ошибке.

Ниже приведён патч в формате unified diff для исправления данной проблемы.

[-]
Index: wp-login.php
===================================================================
--- wp-login.php (original)
+++ wp-login.php (corrected)
@@ -94,5 +94,5 @@
    if ( empty($key) ) {
        // Generate something random for a key...
-       $key = wp_generate_password();
+       $key = wp_generate_password(20, false);
        do_action('retrieve_password_key', $user_login, $key);
        // Now insert the new md5 key into the db
Index: wp-includes/pluggable.php
===================================================================
--- wp-includes/pluggable.php (original)
+++ wp-includes/pluggable.php (corrected)
@@ -1169,6 +1169,9 @@
  * @return string The random password
  **/
-function wp_generate_password($length = 12) {
-   $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()";
+function wp_generate_password($length = 12, $special_chars = true) {
+   $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
+   if ( $special_chars )
+       $chars .= '!@#$%^&*()';
+
    $password = '';
    for ( $i = 0; $i < $length; $i++ )
Добавить в закладки

Связанные записи

26
Июнь
2008

Комментарии к статье «Сброс пароля в WordPress 2.5.1» (5)

  1. Vladimir says:

    Есть один маленький нюанс: если попытка сброса пароля производилась до исправления кода, то пароль сбросить не удастся. Причина в том, что патч исправляет только новые коды активации, а старые (которые хранятся в базе данных) не трогает.

    Поэтому привожу более полную версию патча (только для wp-login.php):

    [-]
    View Code Diff
    --- wp-login.php (original)
    +++ wp-login.php (corrected)
    @@ -91,9 +91,9 @@
            do_action('retrieve_password', $user_login);

            $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login));
    -       if ( empty($key) ) {
    +       if ( empty($key) || preg_match('/[^a-z0-9]/i', $key) ) {
                    // Generate something random for a key...
    -               $key = wp_generate_password();
    +               $key = wp_generate_password(20, false);
                    do_action('retrieve_password_key', $user_login, $key);
                    // Now insert the new md5 key into the db
                    $wpdb->query($wpdb->prepare("UPDATE $wpdb->users SET user_activation_key = %s WHERE user_login = %s", $key, $user_login));
  2. vabout says:

    Здраствуйте. Вот теперь я пришел к вам. Я поменял пароль и забыл записать - можно как то восстановить пароль! Может можно как то с фтп это сделать! Заранее благодарен. Если не трудно ответьте на емейл!

  3. Vladimir says:

    Ответил на email.

  4. Vladimir says:
    [-]
    Download reset.php
    <?php
        require_once('wp-config.php');

        $new_password = md5('password'); //Новый пароль
        $username     = 'admin'; //Имя пользователя, которму сбрасываете паоль
        $wpdb->query("UPDATE `{$wpdb->prefix}users` SET `user_pass` = '{$new_password}' WHERE `user_login` = '{$username}'");
    ?>

    Редактируете этот файл, загружаете к себе на блог (туда, где лежит wp-config.php) и затем открываете его в браузере. Он Вам поставит новый пароль.

Подписаться на RSS-ленту комментариев к статье «Сброс пароля в WordPress 2.5.1» Trackback URL: http://blog.sjinks.org.ua/wordpress/patches/206-reset-password-in-wordpress-251/trackback/

Извините, комментарии закрыты.