Как вордпресс хеширует пароль?

Статус
Закрыто для дальнейших ответов.

BrMisha

Member
Регистрация
26.10.2011
Сообщения
21
у меня на сайте в основном домене стоит Wordpress, а на поддомене есть еще один сайт, без CMS, там есть форма для ввода логина и пароля. Когда пользователь вводит логин и пароль, то скрипт лезет в БД вордпресса, проверяет если ли такой пользователь, если да, то проверяет пароль. Так вот, вордпресс хеширует пароль через md5, но я не могу понять, как? К примеру, я через панель управления в wordpress ставлю пароль 123456, в БД записывается P$Bj31.HJ2RNY18j9C26QsssO5Ww26RM., а если я просто через phpMyAdmin записываю пароль, установив кодировку md5, то получается e10adc3949ba59abbe56e057f20f883e. Соответственно, когда я в моем скрипте проверяю правильность пароля
Код:
if ($field->user_pass != md5($my_password))
, то возвращается false, если пароль установлен через админку вордпресса, но возвращается true, если пароль установлен через phpMyAdmin. Получается, функция md5() генерирует пароль так само, как phpMyAdmin.
При этом, если я установлю пароль через phpMyAdmin, то смогу входить на сайт через установленный пароль, но после входа пароль в БД опять меняется.
Как я могу в своем скрипте проверить MD5, который установленный через Wordpress?
Спасибо!

да, и еще: может можно как то сделать, чтобы вордпресс генерировал такой же пароль, как и функция md5 в php?
 

brevis

Well-Known Member
Регистрация
10.08.2010
Сообщения
452
Кто виноват Как хеширует:

wp-includes/pluggable.php:

Код:
/**
* Create a hash (encrypt) of a plain text password.
*
* For integration with other applications, this function can be overwritten to
* instead use the other package password checking algorithm.
*
* @since 2.5
* @global object $wp_hasher PHPass object
* @uses PasswordHash::HashPassword
*
* @param string $password Plain text user password to hash
* @return string The hash string of the password
*/
function wp_hash_password($password) {
global $wp_hasher;

if ( empty($wp_hasher) ) {
require_once( ABSPATH . 'wp-includes/class-phpass.php');
// By default, use the portable hash from phpass
$wp_hasher = new PasswordHash(8, TRUE);
}

return $wp_hasher->HashPassword($password);
}
Там же есть функция wp_check_password().


Что делать:

Можно конечно (наверное) исправить эти функции таким образом, что бы для хеширования использовалась md5().
Но лучше будет подтянуть в свой скрипт класс PasswordHash (wp-includes/class-phpass.php) и
Код:
if ($field->user_pass != md5($my_password))
заменить на код из функции wp_check_password():
Код:
$wp_hasher = new PasswordHash(8, TRUE);
$check = $wp_hasher->CheckPassword($password, $hash);
 

BrMisha

Member
Регистрация
26.10.2011
Сообщения
21
сделал как вы написали:
Код:
require("../www/wp-includes/class-phpass.php");
$wp_hasher = new PasswordHash(8, TRUE);
$check = $wp_hasher->CheckPassword("123456", "$P$BOvQYoHxOvq5BcQIIBeuCR0er.xA3B1");
в результате, браузер застряет на последней на последней строке, тоесть браузер бесконечно что то грузит.
 

BrMisha

Member
Регистрация
26.10.2011
Сообщения
21
а как сделать, чтобы wp генерировал просто md5?
 

lekzd

parse error: parse error, unexpected T_STRING...
Регистрация
17.02.2011
Сообщения
1 125
заменить вызовы crypt на md5 + поглядеть настройки полей в БД, есть вероятность генерации хеша при записи
 

BrMisha

Member
Регистрация
26.10.2011
Сообщения
21
нашел причину зависания.
вот этот код работает правильно:
Код:
require('../www/wp-includes/class-phpass.php');
$wp_hasher = new PasswordHash(8, TRUE);
$check = $wp_hasher->CheckPassword("123456", '$P$BOvQYoHxOvq5BcQIIBeuCR0er.xA3B1');
Тоесть, когда хэш пароля заключен в апострофы, скрипт работает нормально,но когда в апострофы (соответственно, обрабатывает спецсимволы), то скрипт виснет.
Когда я запрашиваю данные с БД, то превращаю их в объект:
Код:
$tfield = mysql_query("SELECT * FROM wp_users WHERE user_login='".$login."';"); // запрашиваем всю строку
$field = mysql_fetch_object($tfield); // закидаем в object
Вот тут скрипт тоже виснет. Как можно сделать, чтобы в $field строки не обрабатывались, тоесть, были бы как в апострофах?
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Там MD5 с префиксом $P$B
 

BrMisha

Member
Регистрация
26.10.2011
Сообщения
21
неа, там вообще по другом.
Да с этим я уже разобрался, ответьте плиз на вопрос в 7 посте
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
неа, там вообще по другом.
Ах, да, сейчас почитал, что начиная с версии 2.7 пароль кэшируется по новому алгоритму.

Тоесть, когда хэш пароля заключен в апострофы, скрипт работает нормально,но когда в апострофы (соответственно, обрабатывает спецсимволы), то скрипт виснет.
Я так понял во втором случае опечатка.
Ты знаешь различия между апострофами и кавычками в PHP?
Вкратце - если текст в кавычках, то скрипт ищет внутри строки PHP сущности, а именно переменные. В данном случае $P и $B интерпретатор читает как переменные. Поэтому скрипт зависает (хотя должен выдавать ошибку...наверное где то бесконечный цикл появляется)

Вот тут скрипт тоже виснет. Как можно сделать, чтобы в $field строки не обрабатывались, тоесть, были бы как в апострофах?
Тут вообще не понятно.
 

BrMisha

Member
Регистрация
26.10.2011
Сообщения
21
Сорри, действительно опечатка, хотел написать так: когда хэш пароля заключен в апострофы, скрипт работает нормально,но когда в кавычки (соответственно, обрабатывает спецсимволы), то скрипт виснет.
Вот как сделать, чтобы строка, считаная с БД была как бы в апострофах? Я пробовал превращать данные не в объект, а в массив (mysql_fetch_array), но результата это не дало.
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Насколько я знаю, в WP все проще
Код:
global $wpdb;
$tfield = $wpdb->get_results("SELECT * FROM wp_users WHERE user_login='".$login."';"); // запрашиваем всю строку
echo $tfield[0]->password;
Но так работают в функциях. Мне кажется должно работать и в отдельном файле, т.к. ты уже подключил class-phpass.php

Если не сработает, то смотри что тебе выдает ТВОЙ запрос через print_r()
И потом скорее всего тебе придется просто брать нужный аргумент из массива.
 

brevis

Well-Known Member
Регистрация
10.08.2010
Сообщения
452
Вообще очень странно, что у тебя скрипт виснет. В первом случае ("$P$B..." ) должны просто выскочить notice что переменные $P и $B не определены. Но скрипт виснуть никак не должен. Может у тебя переопределена обработка ошибок на свою функцию и проблема именно в этом месте?
А со вторым случаем мне вообще не понятно... Я кстати у себя проверил -- всё ок.

Может у тебя php сконфигурирован нестандартно? Попробуй запусть код на другом типичном сервере. Если заработает (что скорее всего) -- сравни конфиги.
 

BrMisha

Member
Регистрация
26.10.2011
Сообщения
21
Проблема решена. А прична была банальной - запрашивал данные не с той базы:)
 

BrMisha

Member
Регистрация
26.10.2011
Сообщения
21
Возникла новая проблема.
Проверил на денвере, там работало отлично, загрузил на сервер по фтп, там сразу выскочила ошибка
Fatal error: require_once() [function.require]: Failed opening required '../www/wp-includes/class-phpass.php' (include_path='.:/usr/local/pear') in /home/kibermas/kibermaster.net/meteo/wp.php on line 20
Саппорт хостинга посоветовал сменить open_basedir с /home/kibermas/kibermaster.net/meteo на /home/kibermas/kibermaster.net, я так и сделал, ошибка пропала и появилась новая:
Notice: Undefined index: login in /home/kibermas/kibermaster.net/meteo/index.php on line 23
Notice: Undefined index: password in /home/kibermas/kibermaster.net/meteo/index.php on line 24
вот те строки:
Код:
$current_user["login"] = chop($_POST["login"]);
$current_user["password"] = chop($_POST["password"]);
Саппорт сказал, что этот вопрос не к нему, а к программистам:).
Я так понял, тут проблема с формой, вот что в ней:
Код:
<form id="flogin" name="flogin" method="post" action="<?php echo $PHP_SELF ?>">
Логин: <input name="login" type="text" value="<?php echo ($current_user["login"]) ?>" size="20" maxlength="20" />
<br />
Пароль:
<input name="password" type="password" value="<?php echo ($current_user["password"]) ?>" size="20" maxlength="20" />
<br />
   <input type="submit" name="update" value="Обновить">
</form>
Когда пишу что то в форме и нажимаю сабмит, то выскакивает ошибка
Not Found

The requested URL /<br /><b>Notice</b>: Undefined variable: PHP_SELF in <b>/home/kibermas/kibermaster.net/meteo/index.php</b> on line <b>28</b><br /> was not found on this server.
Я так понял, после того, как я поменял open_basedir, то скрипт не может знать, где он находится, поэтому при action="<?php echo $PHP_SELF ?> он отправялет форму в неизвестность:)
Что можно сделать с этим глюком?

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

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Ты наверное хотел заюзать глоб. массив $_SERVER['PHP_SELF']?

Почитай статью softtime.ru/article/index.php?id_article=69
очень интересная и добавь в закладки.
 
Статус
Закрыто для дальнейших ответов.
Верх Низ