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

Проблемы с установкой или работой 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) | Как задавать вопросы | Как устанавливать моды

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

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

Сообщение nissin »

Хм, судя по комментарию в
http://code.phpbb.com/svn/phpbb/branche ... l_hash.php

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

* @PHP dev team: no, a hexdec() applied to it does not solve the issue. And please document it.
это носит принципиальный характер :)
Dudarik
phpBB 1.2.0
Сообщения: 17
Стаж: 16 лет 7 месяцев
Откуда: Курган
Поблагодарили: 2 раза

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

Сообщение Dudarik »

Здравствуйте всем :) Поздравляю всех с праздником 23 февраля :)
И опять у меня все та же проблема. Для некоторых русских ников, по разному генерируется поле "username_clean", на домашнем компе и на хостиге. В следствии чего пользователи не могут восстановить свой пароль. Опять же прошу помощи.

for example 1:
На хостинге:
username="Милашка"
username_clean="милaш?a"
Дома:
username="Милашка"
username_clean="l?илaш?a"

for example 2:
На хостинге:
username="Матёрый_Контролёр"
username_clean="мaтёp?iй_?oнтpoлёp"
Дома:
username="Матёрый_Контролёр"
username_clean="k?aтёp?iй_?oнтpoлёp"

Для генерации значения поля username_clean пользовался скриптом из этого поста
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

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

Сообщение rxu »

Dudarik писал(а):по разному генерируется поле "username_clean", на домашнем компе и на хостиге. В следствии чего пользователи не могут восстановить свой пароль.
А какая связь между этими событиями?
Изображение
Dudarik
phpBB 1.2.0
Сообщения: 17
Стаж: 16 лет 7 месяцев
Откуда: Курган
Поблагодарили: 2 раза

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

Сообщение Dudarik »

rxu
не совсем понял вашего вопроса.
Выше, в этом топике мы разобрались, что на разных системах (32/64 разрядных) генерируется по разному значение поля user_email_hash. Я лишь предположил, что проблема невозможности восстановления пароля, с вышеупомянутыми никами, кроется в разности генерации значения поля username_clean. т.к. для восстановления пароля используется следующий 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)) . "'"; 
Скажем, пользователь с ником "Хабар_овчанин" может восстановить пароль без проблем.
-----------------------------------------------------------------------------
Сейчас посмотрел значения поля username_clean для ника "Хабар_овчанин" так же отличаются на хостиге и дома. Тогда вообще не понимаю в чем причина :(.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17272
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 632 раза
Поблагодарили: 2412 раз

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

Сообщение rxu »

Dudarik
Просто генерируйте поле сразу на сервере.
Изображение
Dudarik
phpBB 1.2.0
Сообщения: 17
Стаж: 16 лет 7 месяцев
Откуда: Курган
Поблагодарили: 2 раза

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

Сообщение Dudarik »

Сразу на сервере - т.е. при регистрации пользователя ? Если бы было все так просто :)
Дело в том, что я переношу БД с UcoZ'a на phpBB3, в базе 4000+ пользователей, скрипт переноса пользователей из дампа юкоза в таблицы phpBB3 работает достаточно долго(более 30сек), так что нет возможности выполнить скрипт на сервере (хостниге). Приходиться пользоваться постобработкой с помощью подобных скриптов.
--------------------------------------------------------------------------------------------------------------------------------
Порылся в исходниках посмотрел что и как получается. Вот код, который обновляет поле username_clean:

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

$username_clean = $db->sql_escape(utf8_clean_string($value));
    echo $key."==".$username_clean . '<br />';
    $sql = 'UPDATE ' . USERS_TABLE . " SET username_clean = '" . $username_clean . "' WHERE user_id = $key";
    $db->sql_query($sql); 
Вторую строчку специально дописал что бы вывести в результат работы функции utf8_clean_string() в браузер, дык вот получается что при выводе в браузер логин(ник) "Матёрый_Контролёр" превращается в "мaтёpƅiй_ĸoнтpoлёp", а при добавлении в БД тот же ник превращается в "мaтёp?iй_?oнтpoлёp". Логично предположить, что при восстановлении пароля (описание в этом посте) сравнивается результат работы функции utf8_clean_string() == "мaтёpƅiй_ĸoнтpoлёp" и значение поля БД username_clean == "мaтёp?iй_?oнтpoлёp", как видно результат будет равным false => такой пользователь не найден. Возникает вопрос. Как добавлять в БД правильный результат работы функции utf8_clean_string() ?

P.S. Все таблицы в БД в кодировке utf8_bin.
Последний раз редактировалось Dudarik 23.02.2010 9:42, всего редактировалось 1 раз.
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

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

Сообщение nissin »

А кодировка поля username_clean какая?
Должна быть utf8_bin, дамп тоже делайте в utf8, тогда проблем не будет.
Для имени "Милашка" очищенное поле - "милaшĸa".
Для имени "Матёрый_Контролёр" очищенное поле - "мaтёpƅiй_ĸoнтpoлёp".
Если у Вас по другому, значит проблема с кодировками.

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

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

Сообщение Dudarik »

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

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

Сообщение nissin »

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

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

Сообщение Dudarik »

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

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

Сообщение nissin »

phpmyadmin в котором содержание полей смотрите тоже в кодировке utf8?
Dudarik
phpBB 1.2.0
Сообщения: 17
Стаж: 16 лет 7 месяцев
Откуда: Курган
Поблагодарили: 2 раза

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

Сообщение Dudarik »

nissin
Проблема все таки в кодировке самой БД. Я так и не понял, что я сделал, но на домашнем компе значение поля username_clean стало выводиться корректно, соответственно стала работать функция восстановления пароля. На хостинге же пока что не работает. Но за то понял куда "копать". В любом случае спасибо за помощь :)
-----------------------------------------------------------------------------------------------------------------
Разобрался с кодировками обновил данные в поле username_clean все встало на свои места :)
Аватара пользователя
shootnik
phpBB 1.0.0
Сообщения: 9
Стаж: 19 лет 10 месяцев
Откуда: Київ

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

Сообщение shootnik »

спасибо за дельные ответы на данную тему :)

код фикса
* возможно придется запустить 2 раза

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

<?php
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
require($phpbb_root_path . 'includes/functions_module.' . $phpEx);

// Start session management
$user->session_begin();
$auth->acl($user->data);

$my_upd = array();

$sql = 'SELECT user_id, username, username_clean, user_email, user_email_hash
         FROM ' . USERS_TABLE . "
         WHERE 1;"; 
$result = $db->sql_query($sql);

while ($row = $db->sql_fetchrow($result))
{
    if ( $row['username_clean'] != utf8_clean_string($row['username'])){
        $my_upd['username_clean'][$row['user_id']] = utf8_clean_string($row['username']);
    }
        
    if ( $row['user_email'] != strtolower($row['user_email'])){
        $my_upd['user_email'][$row['user_id']] = strtolower($row['user_email']);
    }
    
    if ( $row['user_email_hash'] != phpbb_email_hash($row['user_email'])){
        $my_upd['user_email_hash'][$row['user_id']] = phpbb_email_hash($row['user_email']);
    }
}
    
$db->sql_freeresult($result);

if ( $my_upd['username_clean'] ){
    foreach ($my_upd['username_clean'] as $uk => $uu){
        print ("<br/>");
        print
        $sql = 'UPDATE ' . USERS_TABLE . " SET username_clean = '" . $db->sql_escape($uu) . "' WHERE user_id = $uk;";
        $db->sql_query($sql);
    }
    print ("<br/>");print ("<br/>");print ("<br/>");
}

if ( $my_upd['user_email'] ){
    foreach ($my_upd['user_email'] as $uk => $ue){
        print ("<br/>");
        print
        $sql = 'UPDATE ' . USERS_TABLE . " SET user_email = '" . $db->sql_escape($ue) . "', user_email_hash = '" . $db->sql_escape(phpbb_email_hash($ue)) . "' WHERE user_id = $uk;";
        $db->sql_query($sql);
    }
    print ("<br/>");print ("<br/>");print ("<br/>");
} 

elseif ( $my_upd['user_email_hash'] ){
    foreach ($my_upd['user_email_hash'] as $uk => $ueh){
        print ("<br/>");
        print
        $sql = 'UPDATE ' . USERS_TABLE . " SET user_email_hash = '" . $db->sql_escape($ueh) . "' WHERE user_id = $uk;";
        $db->sql_query($sql);
    }
    print ("<br/>");print ("<br/>");print ("<br/>");
}    

//print_r($my_upd);
?>
SVEN_A200
phpBB 1.0.0
Сообщения: 1
Стаж: 16 лет 9 месяцев

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

Сообщение SVEN_A200 »

Здравствуйте.

А у меня такая ситуация - пишет - У вас нет доступа к получению нового пароля.
Т.е. ввожу логин и почту, появляется данная фраза.

версия 3.0.8
Аватара пользователя
владимир1983
phpBB 3.2.6
Сообщения: 5954
Стаж: 16 лет 4 месяца
Откуда: Сергиев Посад
Благодарил (а): 373 раза
Поблагодарили: 727 раз

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

Сообщение владимир1983 »

Админка>права доступа>/глобальные права доступа/>права групп>"ваша группа">Профиль:
Может менять пароль Да Нет Никогда
У вас что?
За ваши деньги решу ваши проблемы. Стучи в ЛС.
Нет человека - нет проблемы. (c)

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