1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

1.1.1 Изменение шифрования паролей на md5

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем lazy72, 26.01.2012.

Загрузка
  1. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    А потом кто людям будет искать, почему они не могут после апгрейда заюзать сторонний сервис или вообще непонятные глюки, когда оно до апгрейда работало?
    В Вашем случае (когда Вы вообще изменили схему аутентификации дефолтную) при апгрейде получим тупо ошибку при вводе пароля и, хорошо, если вспомним, что правили.
    Плагины потому и пишутся, чтобы обеспечить максимальную переносимость и меньшие проблемы при апгрейде. Да и более предсказуемый результат часто помогает.
    Я вот буквально недавно столкнулся с тем, что один не совсем хорошо написанный плагин банально перекрывал возможность расширить один класс. Так вот достаточно было просто отключить плагин, из-за которого была проблема, и убедиться, что проблема именно в нем. А если исходники в 10-ти местах будут "подправлены", то искать проблемы будет уже даже не интересно.

    Если уж Вам так важно обойтись без плагина, но с возможными проблемами в будущем, то пожалуйста, вот решение:
    1) ищем примерно 380 строку в файле library/XenForo/DataWriter/User.php
    2) там должно быть что-то типа $auth = XenForo_Authentication_Abstract::createDefault();
    3) поменяйте это на $auth = XenForo_Authentication_Abstract::create('XenForo_Authentication_vBulletin');

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

    P.S. Я сам это не пробовал. Т.е. методика чисто по изученному коду. Но работать должно.
     
  2. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Наверное вы меня не так поняли) Я не собирался писать плагин для ксенфоро, я просто хотел сделать регистрацию, а мою тему из общих вопросов перекинули в этот раздел, это наверное вас и запутало. Т.е. решение для меня, а если уж кто согласен использовать подобное, то пожалуйста. Но я ни в коем случае не претендую, что бы это считалось плагином или на то, что данное решение может подойти кому то еще.
    К сожалению, способ, указанный вами, как я понял, не пойдет. Если рассмотреть класс vBulletin поближе, то можно заметить, что он только расшифровывает полученный sereliaze, и по полученной информации строит хеш, т.е. только читает, и подходит только для авторизации, когда все данные известные. При регистрации же, генерируется соль, формируется строка, данные записываются. Всего этого vBulletin.php не умеет, и его в любом случае надо учить, что я и сделал. Когда я пойму как делать плагины, постараюсь сделать всё как положено. А пока, в данной ситуации, когда необходимо запускать форум с уже готовой базой юзеров в md5(md5($pas).salt) и регистрацией при том же хешировании, мой способ меня вполне устраивает.
     
  3. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Хм. Вообще-то схема аутентификации предусматривает как проверку пароля, так и формирование его хеша. Как я понял, Вы и не пробовали то, что я Вам предоставил. Ну дело Ваше. Если Вам лень даже готовый вариант взять, но при этом не боитесь изобретать свой собственный велосипед с квадратными колесами....

    Ах да. Ради интереса представьте себе, каким же это чудесным образом можно проверить введенный пароль, если нет процедуры получения из пароля его хеша ;)
     
  4. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Вот мне кажется, что вы совсем не читаете, то, что я написал, а твердите своё.
    Тут я объясняю разницу между регистрацией и аутификацией.

    Исходя из того, что вы написали, не надо долго думать, что если заменить класс core на vBulletin, получится тоже самое. Я это и сделал в начале своих поисков решения, в результате получил ошибку при регистрации. Так что второй раз это проделывать не обязательно, что бы понять, что результат будет таким же.
    Но я проделал аналогичную операцию второй раз, точно следуя вашей инструкции (раз вы так уверены в своей правоте, отчего же не попробовать). После чего получил подобную ошибку:
    Код:
    Server Error
     
    Cannot generate authentication for this type.
    XenForo_Authentication_vBulletin->generate() in XenForo/DataWriter/User.php at line 363
    XenForo_DataWriter_User->setPassword() in XenForo/ControllerPublic/Register.php at line 158
    XenForo_ControllerPublic_Register->actionRegister() in XenForo/FrontController.php at line 310
    XenForo_FrontController->dispatch() in XenForo/FrontController.php at line 132
    XenForo_FrontController->run() in Z:/home/localhost/www/f/index.php at line 13
    Что совсем не удивительно, потому что, как я писал выше, класс vBulletin не умеет регистрировать новые пароли. И я именно этому его учил.

    Не буду приводить оба класса, что бы не забивать место, вы сами можете открыть их, сравнить, и убедиться, что функции там разные.

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

    В любом случае я благодарен вам за то, что вы пытаетесь мне помогать.

    Всё же свой квадратный велосипед лучше, чем инструкция с эфемерным результатом.
     
  5. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Оверквотинг, ну пусть будет понятнее. Хорошо, что Вы все же попробовали :) Вот теперь есть, о чем поговорить. Я же не утверждаю, что мое мнение - единственное правильное. У меня просто другой вариант решения Вашей проблемы. И на мой взгляд прозрачнее и безопаснее. Кстати, есть и другие варианты, но скорее они будут требовать еще больших изменений.
    Я действительно не учел, что в vBulletin стоит заглушка на генераторе. Но в таком случае буквально в следующих строках и нужно прописать генератор. Т.е. вместо:
    Код:
                    $auth = XenForo_Authentication_Abstract::createDefault();
                    $authData = $auth->generate($password);
                    if (!$authData)
                    {
                            $this->error(new XenForo_Phrase('please_enter_valid_password'), 'password');
                            return false;
                    }
    
    нужно написать
    Код:
                   $auth = XenForo_Authentication_Abstract::create('XenForo_Authentication_vBulletin');
                    if (!is_string($password) || $password === '')
                    {
                            $this->error(new XenForo_Phrase('please_enter_valid_password'), 'password');
                            return false;
                    }
     
                    $salt = $auth->_createHash($auth->generateSalt());
                    $hash = $auth->_createHash($auth->_createHash($password) . $salt);
                    $authData = serialize(array('hash' => $hash, 'salt' => $salt, 'hashFunc' => 'md5'));
    
    Могут быть неточности, но смысл именно таков. Я же говорю, проще это плагином оформлять. Там нужно-то лишь один метод переписать, если уж сильно хочется. Возможно, в последней строке нет необходимости последний элемент массива создавать, так как он в любом случае в дальнейшем не используется.
    И еще раз повторю, я изначально против Вашего велосипеда лишь потому, что он может привести к непредсказуемым результатам, если обновиться. Те изменения, которые я предложил внести, безопасны, так как, будучи переписанными при апгрейде, не приведут к отказу в аутентификации.
     
    lazy72 нравится это.
  6. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Большое спасибо! Постараюсь учесть при дальнейшей работе)
     
  7. lazy72

    lazy72 Местный

    Регистрация:
    26.01.12
    Сообщения:
    25
    Симпатии:
    3
    Версия XF:
    1.1.1
    Код:
     Fatal error: Call to protected method XenForo_Authentication_vBulletin::_createHash() from context 'XenForo_DataWriter_User' in \library\XenForo\DataWriter\User.php on line 369
    Дело в том, что в vBull не генерирует соль. Поэтому соль взял из Xenforo_Application плюс заменил заведомо известную строку
    Код:
    $hash = $auth->_createHash($auth->_createHash($password) . $salt);
    на
    Код:
    $hash = md5(md5($password) . $salt);
    ,
    вставил в XenForo_DataWriter_User и всё заработало
    в итоге получилось вот так:
    PHP:
                  $auth XenForo_Authentication_Abstract::create('XenForo_Authentication_vBulletin');
                    if (!
    is_string($password) || $password === '')
                    {
                            
    $this->error(new XenForo_Phrase('please_enter_valid_password'), 'password');
                            return 
    false;
                    }
     
                    
    $salt XenForo_Application::generateRandomString(64);;
                    
    $hash md5(md5($password) . $salt);
                    
    $authData serialize(array('hash' => $hash'salt' => $salt'hashFunc' => 'md5'));
            if (!
    $authData)
            {
                
    $this->error(new XenForo_Phrase('please_enter_valid_password'), 'password');
                return 
    false;
            }
    Большое спасибо за помощь.
    Как я понял, на этой базе можно писать плагин?)
     
  8. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    В общем да. Т.е. по идее нужно лишь один метод заменить в этом классе. Написание плагина - тема отдельная. В двух словах нужно:
    1) включить режим отладки (чтобы появились функции создания дополнения);
    2) в админке создать новое дополнение;
    3) в library/ создаем новую папку и в ней нужно будет создать два файла - для отлова события load_class_datawriter и файл с расширением класса XenForo_DataWriter_User;
    4) в админке прописываем обработчик события;
    5) профит :)

    И еще. Последний if (!authData... не нужен.
     
  9. timda

    timda Активный пользователь

    Регистрация:
    28.03.12
    Сообщения:
    9
    Симпатии:
    0
    В новых версиях не появилось переключения на MD5 ?
    У меня задача интегрировать базу пользователей портала с новым форумом, но сейчас пароли хранятся в MD5-хэше.
     

Поделиться этой страницей