Патч, решающий проблему сброса пароля в 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 не кажется логичным, поэтому будем исправлять то, что есть.
Проблема возникает из-за двух особенностей (читай: ошибок):
- Случайно генерируемый пароль содержит специальные символы
!@#$%^&*()
, вследствие чего ссылка с кодом для сброса пароля воспринимается неправильно (почтовики воспринимают ссылку лишь частично — забыли разработчики прогнать сгенерированный пароль черезurlencode()
). - Вторая ошибка гораздо серьёзнее: рассмотрим, почему. Допустим, пришло письмо с ссылкой на
wp-login.php?action=rp&key=hX(ZLKYR)*gl
. WordPress вызоветreset_password("hX(ZLKYR)*gl")
, а в функцииreset_password()
есть такая замечательная строка:[-]View Code PHP- $key = preg_replace('/[^a-z0-9]/i', '', $key);
Иными словами, всё, что не цифра и не буква английского алфавита, будет удалено. Код активации примет вид
hXZLKYRgl
и будет сравниваться с кодом, который хранится в базе данных (hX(ZLKYR)*gl
). Очевидно, что они не совпадут, и мы увидим сообщение об ошибке.
Ниже приведён патч в формате unified diff для исправления данной проблемы.
===================================================================
--- 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++ )
Есть один маленький нюанс: если попытка сброса пароля производилась до исправления кода, то пароль сбросить не удастся. Причина в том, что патч исправляет только новые коды активации, а старые (которые хранятся в базе данных) не трогает.
Поэтому привожу более полную версию патча (только для
wp-login.php
):+++ 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));
Здраствуйте. Вот теперь я пришел к вам. Я поменял пароль и забыл записать - можно как то восстановить пароль! Может можно как то с фтп это сделать! Заранее благодарен. Если не трудно ответьте на емейл!
Ответил на email.
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
) и затем открываете его в браузере. Он Вам поставит новый пароль.Спасибо! Спас ты меня от долгой возни, с phpadmin