Проблема с восстановлением пароля

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Dudarik
phpBB 1.2.0
Сообщения: 17
Стаж: 16 лет 7 месяцев
Откуда: Курган
Поблагодарили: 2 раза

Проблема с восстановлением пароля

Сообщение Dudarik »

Сразу хочу извиниться если такая тема уже существовала, ну а если существует то просто ткните меня носом где такое есть.

Вообщем обо всем по порядку.
Конвертировал базу в формат phpbb3, пришлось генерировать новые пароли для пользователей, проверил, все работает (дома установлен denwer). Переношу на хостинг, при попытке востановить пароль появляется сообщение: "Указанная информация о e-mail/имени пользователя не найдена." данные о пользователях естественно в базе есть, ибо, повторюсь, на домашнем PC все работает и все пароли высылаются на e-mail пользователя.

(на сервере)Сопоставление соединения с MySQL:utf8_unicode_ci
(дома)Сопоставление соединения с MySQL:cp1251_general_ci
Пробовал менять - результата нуль.
Все таблицы: utf8_bin

Скопировал часть скрипта из файла ucp_resend.php в отдельный файл:

Код: Выделить всё

<?php
//dumper() - функция для вывода на печать массивов.
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
require($phpbb_root_path . 'common.' . $phpEx);
require($phpbb_root_path . 'includes/functions_user.' . $phpEx);
require($phpbb_root_path . 'includes/functions_module.' . $phpEx);
require("dumper.php");

$email="dudarik@yandex.ru";
$username="Alex";

$sql = 'SELECT user_id, username, user_email, user_jabber, user_notify_type, user_type, user_lang, user_inactive_reason
                FROM ' . USERS_TABLE . "
                WHERE user_email = '" . $db->sql_escape($email) . "'
                    AND username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
            $result = $db->sql_query($sql);
            $user_row = $db->sql_fetchrow($result);
            dumper($user_row);
?>
Что на сервере, что дома данные из базы выбираются корректно:

Код: Выделить всё

Array[8]
      user_id => "61"
      username => "Alex"
      user_email => "dudarik@yandex.ru"
      user_jabber => ""
      user_notify_type => "0"
      user_type => "0"
      user_lang => "ru"
      user_inactive_reason => "0"
Вообщем, прошу совета куда копать дальше?
Версия форума: чистая (без модов) 3.0.6.
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Re: Проблема с восстановлением пароля

Сообщение nissin »

При переносе с localhost побилось поле username_clean, dump должен быть в кодировке utf8.
Dudarik
phpBB 1.2.0
Сообщения: 17
Стаж: 16 лет 7 месяцев
Откуда: Курган
Поблагодарили: 2 раза

Re: Проблема с восстановлением пароля

Сообщение Dudarik »

Нет :) , т.к. запускал на сервере скрипт который из поля username записывает данные в username_clean = utf8_clean_string($username)
К тому же тогда не работал бы вышенаписанный скрипт т.к.

Код: Выделить всё

 AND username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Re: Проблема с восстановлением пароля

Сообщение nissin »

На латинских символах проблем обычно и не возникает, только с русскими.
Проверьте ещё значение поле user_email_hash. Поскольку в 3.0.6 строка проверки выглядит так:

Код: Выделить всё

				WHERE user_email_hash = '" . $db->sql_escape(phpbb_email_hash($email)) . "'
					AND username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
На всякий случай код функции phpbb_email_hash():

Код: Выделить всё

function phpbb_email_hash($email)
{
	return crc32(strtolower($email)) . strlen($email);
}
Dudarik
phpBB 1.2.0
Сообщения: 17
Стаж: 16 лет 7 месяцев
Откуда: Курган
Поблагодарили: 2 раза

Re: Проблема с восстановлением пароля

Сообщение Dudarik »

Я заметил что есть две функции ucp_resend.php и ucp_remind.php но судя из кода ucp.php:

Код: Выделить всё

case 'resend_act':
        $module->load('ucp', 'resend');
        $module->display($user->lang['UCP_RESEND']);
    break;

    case 'sendpassword':
        $module->load('ucp', 'remind');
        $module->display($user->lang['UCP_REMIND']);
    break; 
При восстановлении пароля вызывается функция remind, а не resend соответственно поле user_email_hash не проверяется, а вызывается код, который я написал в первом посте темы. Но и поле user_email_hash записывал с помощью функции phpbb_email_hash(). Сейчас сравнил хэши e-mail'ов на домашнем копьютере и на хостинге - абсолютно идентичны.
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Re: Проблема с восстановлением пароля

Сообщение nissin »

Я честно не понимаю чего Вы упираетесь.
Медленно и печально распаковываем дистрибутив 3.0.6, открываем файл includes/ucp/ucp_remind.php. Ищем там текст SQL запроса:

Код: Выделить всё

			$sql = 'SELECT user_id, username, user_permissions, user_email, user_jabber, user_notify_type, user_type, user_lang, user_inactive_reason
				FROM ' . USERS_TABLE . "
				WHERE user_email_hash = '" . $db->sql_escape(phpbb_email_hash($email)) . "'
					AND username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
Если Вам выдаётся ошибка, то какое-то значение неверно, либо очищенное имя пользователя либо хэш email.
Вы уверены, что у Вас версия 3.0.6?
Dudarik
phpBB 1.2.0
Сообщения: 17
Стаж: 16 лет 7 месяцев
Откуда: Курган
Поблагодарили: 2 раза

Re: Проблема с восстановлением пароля

Сообщение Dudarik »

nissin прошу прощения, действительно в версии 3.0.6 ucp_remind.php выглядет как вы и описали, я вчера, видимо по случайности, открыл скрипт форума phpbb 3.0.4.
Вообщем, как я понял (так оно и есть) хэш email генерируется в зависимости от домена (!). т.е. на разных доменах будет разный хэш одного и того же адреса e-mail.
Обновил хэши на хостинге:

Код: Выделить всё

$user_email_hash = $db->sql_escape(phpbb_email_hash($value));
    //echo $username_clean . '<br />';
    $sql = 'UPDATE ' . USERS_TABLE . " SET user_email_hash = '" . $user_email_hash . "' WHERE user_id = $key";
    $db->sql_query($sql); 
И все стало на свои места :)

nissin спасибо за помощь :)
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Re: Проблема с восстановлением пароля

Сообщение nissin »

Хэш email на разных доменах одинаковый, он зависит только от email :)
Dudarik
phpBB 1.2.0
Сообщения: 17
Стаж: 16 лет 7 месяцев
Откуда: Курган
Поблагодарили: 2 раза

Re: Проблема с восстановлением пароля

Сообщение Dudarik »

Я понимаю, что вопрос решен, но все же мне просто интересно...
Действительно, генерация зависит только от e-mail, нашел место в функции user_add где, собственно, генерируется user_email_hash.

Код: Выделить всё

'user_email_hash' => crc32(strtolower($user_row['user_email'])) . strlen($user_row['user_email']), 
Однако на моем домашнем компе для e-mail'а "dudarik@yandex.ru" сгенерировался хэш "-80635440617", а на хостинге, для того же e-mail'а сгенерировался хэш "348861289017" - это обьясняется тем что у меня дома windows, а на сервере Linux ?
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Проблема с восстановлением пароля

Сообщение rxu »

Dudarik писал(а):сгенерировался хэш "-80635440617", а на хостинге, для того же e-mail'а сгенерировался хэш "348861289017" - это обьясняется тем что у меня дома windows, а на сервере Linux ?
А разрядность процессоров одинаковая?
Изображение
Dudarik
phpBB 1.2.0
Сообщения: 17
Стаж: 16 лет 7 месяцев
Откуда: Курган
Поблагодарили: 2 раза

Re: Проблема с восстановлением пароля

Сообщение Dudarik »

Хостинг:
Intel Core2Quad Q6600 2.4 GHz
ОС CentOS 5.x
Дома:
Athlon 64 X2 4200 (2,2GHz)
ОС WinXP (32 разрядная)
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Проблема с восстановлением пароля

Сообщение rxu »

Значит, на сервере 64-хразрядный линух, а дома 32-хразрядная винда. Поэтому и разный результат работы crc32().
Изображение
Dudarik
phpBB 1.2.0
Сообщения: 17
Стаж: 16 лет 7 месяцев
Откуда: Курган
Поблагодарили: 2 раза

Re: Проблема с восстановлением пароля

Сообщение Dudarik »

rxu
Ну я так и думал :)
nissin
rxu
Спасибо за ответы. Тему, думаю, можно закрывать :)
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Re: Проблема с восстановлением пароля

Сообщение nissin »

rxu
Если это так, наверно нужно bugreport по этому поводу писать?
На предмет недопустимости использования crc32() для хеширования, поскольку это осознанная политика в php:
http://bugs.php.net/bug.php?id=39062
В общем отписал как сумел:
http://www.phpbb.com/bugs/phpbb3/ticket ... t_id=57755
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

Re: Проблема с восстановлением пароля

Сообщение rxu »

nissin писал(а):Если это так, наверно нужно bugreport по этому поводу писать?
теоретически - да, но это уже известная разработчикам проблема.
Изображение

Вернуться в «Поддержка phpBB 3.0.х»