Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Авторизация 
:(
    Опции темы
2man
Дата 25.11.2005, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2007
Регистрация: 6.5.2005
Где: Нижние Чигири

Репутация: нет
Всего: 71



Как сделать запрос к базе форума IPB с логином и паролем, хочу сделать такую же форму авторизации как и оригинальная на форуме, только в программе. Чтоб с прогиможно было зайти на форум.
Я беру оригинальный скрипт с кода некоторых частей, которые мне нужны, а именно: проверка введен ли логин и пароль, проверка длины, проверка авторизации...
Код

//-----------------------------------------
            // Make sure the username and password were entered
            //-----------------------------------------

            if ( $_POST['UserName'] == "" )
            {
                    $this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'no_username' ) );
            }

             if ( $_POST['PassWord'] == "" )
             {
                    $this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'pass_blank' ) );
            }

                //-----------------------------------------
                // Check for input length
                //-----------------------------------------

                if ( $this->ipsclass->vars['converge_login_method'] == 'username' )
                {
                        if ( $this->ipsclass->txt_mb_strlen( $_POST['UserName'] ) > 32 )
                        {
                                $this->ipsclass->Error( array( LEVEL => 1, MSG => 'username_long' ) );
                        }

                        $username = strtolower(str_replace( '|', '|', $this->ipsclass->input['UserName']) );
                }
                else
                {
                        $username = strtolower( trim( $this->ipsclass->input['UserName'] ) );
                }

                if ( $this->ipsclass->txt_mb_strlen( $_POST['PassWord'] ) > 32)
                {
                        $this->ipsclass->Error( array( LEVEL => 1, MSG => 'pass_too_long' ) );
                }

                $password = md5( $this->ipsclass->input['PassWord'] );

                //-----------------------------------------
                // Check auth
                //-----------------------------------------

                $this->han_login->login_authenticate( $username, $this->ipsclass->input['PassWord'] );

                //-----------------------------------------
                // Check return code...
                //-----------------------------------------

                $member = $this->han_login->member;

                if ( ( ! $member['id'] ) or ( $this->han_login->return_code == 'NO_USER' ) )
                {
                        $this->log_in_form( 'wrong_name' );
                }

                if ( $this->han_login->return_code != 'SUCCESS' )
                {
                        $this->log_in_form( 'wrong_auth' );
                }

                //-----------------------------------------
                // Is this a partial member?
                // Not completed their sign in?
                //-----------------------------------------

                if ( $member['members_created_remote'] )
                {
                        $pmember = $this->ipsclass->DB->build_and_exec_query( array( 'select' => '*', 'from' => 'members_partial', 'where' => "partial_member_id={$member['id']}" ) );

                        if ( $pmember['partial_member_id'] )
                        {
                                $this->ipsclass->print->redirect_screen( $this->ipsclass->lang['partial_login'], 'act=reg&CODE=complete_login&mid='.$member['id'].'&key='.$pmember['partial_date'] );
                                exit();
                        }
                }

                //-----------------------------------------
                // We in a validating group?
                // still need this?
                //-----------------------------------------

                if ($member['mgroup'] == $this->ipsclass->vars['auth_group'])
                {
                        //$this->log_in_form( 'need_validation' );
                }

                //-----------------------------------------
                // Generate a new log in key
                //-----------------------------------------

                if ( $this->ipsclass->vars['login_change_key'] OR ! $member['member_login_key'] )
                {
                        $member['member_login_key'] = $this->ipsclass->converge->generate_auto_log_in_key();

                        $this->ipsclass->DB->do_update( 'members', array( 'member_login_key' => $member['member_login_key'] ), 'id='.$member['id'] );
                }

В общем мне надо в программе ввести логин и пароль и войти на форум и получить новые сообщения. Как сформировать этот запрос?


--------------------
Быстро поднятое - упавшим не считаеся
PM MAIL ICQ MSN   Вверх
2man
Дата 25.11.2005, 05:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2007
Регистрация: 6.5.2005
Где: Нижние Чигири

Репутация: нет
Всего: 71



Немного покопашвись в литературке я понял, что запрос надо делать так:
Код

SELECT * FROM forum_members, forum_members_converge WHERE forum_members.name = '$login' AND forum_members.email = forum_members_converge.converge_email

Сначала делаю такой вот запрос, в результате получаю полное представление о пользователе, который пытается залогинится (на выходе для удобства преобразовал в массив).
Теперь пытаюсь использую хитрый алгоритм с bitrix.ru и сверить пароли, преобразовав введенный пользователем пароль в хитрый хеш
Код

$ph = md5( md5($t[0]['converge_pass_salt']) . md5($pass) );

После этих действий сверяю полученный из БД "converge_pass_hash" и переменную "$ph". Ну не сходится, хотя все данные верно введены, где косяк, я грешу на алгоритм...
Хотя, т.к. осуществляется поиск пользоватся в базе по логину, делается очистка с помощью штатной (слегка модифенной) функции clean_value().
В функции cleanvalue - везде где после & стоит пробел - его надо убрать. Пришлось пробел добавить, а то парсится сразу
Код

$login = clean_value($login);
$result = mysql_query("SELECT * FROM ibf_members WHERE name='".$login."'");
//if found
if ($row = mysql_fetch_array($result))
{
 $tmp_id = $row[id]; //get user id
 $result = mysql_query("SELECT * FROM ibf_members_converge WHERE converge_id='".$tmp_id."'");
 $converge = mysql_fetch_array($result);
 $converge_passhash = $converge['converge_pass_hash'];
 $converge_passsalt = $converge['converge_pass_salt'];
 $my_passhash = $generate_compiled_passhash( $converge_passsalt, md5($password) );
 if ($converge_passhash == $my_passhash )
 { // password is ok
....
 } // password is ok
} else { //user not found
....
}


function generate_compiled_passhash($salt, $md5_once_password)
{
return md5( md5( $salt ) . $md5_once_password );
}

   function clean_value($val)
   {
   
    if ($val == "")
    {
     return "";
    }
   
    $val = str_replace( "& #032;", " ", $val );
    
$val = str_replace( chr(0xCA), "", $val );  //Remove sneaky spaces
    
    $val = str_replace( "&"            , "& amp;"         , $val );
    $val = str_replace( "<!--"         , "& #60;& #33;--"  , $val );
    $val = str_replace( "-->"          , "--& #62;"       , $val );
    $val = preg_replace( "/<script/i"  , "& #60;script"   , $val );
    $val = str_replace( ">"            , "& gt;"          , $val );
    $val = str_replace( "<"            , "& lt;"          , $val );
    $val = str_replace( "\""           , "& quot;"        , $val );
    $val = preg_replace( "/\n/"        , "<br />"        , $val ); // Convert literal newlines
    $val = preg_replace( "/\\\$/"      , "& #036;"        , $val );
    $val = preg_replace( "/\r/"        , ""              , $val ); // Remove literal carriage returns
    $val = str_replace( "!"            , "& #33;"         , $val );
    $val = str_replace( "'"            , "& #39;"         , $val ); // IMPORTANT: It helps to increase sql query safety.
    
$val = preg_replace("/&amp;#([0-9]+);/s", "&#\\1;", $val );

$val = stripslashes($val);
    
    // Swop user inputted backslashes
    
    $val = preg_replace( "/\\\(?!&amp;#|?#)/", "& #092;", $val ); 
    
    return $val;
   }



--------------------
Быстро поднятое - упавшим не считаеся
PM MAIL ICQ MSN   Вверх
2man
Дата 26.11.2005, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2007
Регистрация: 6.5.2005
Где: Нижние Чигири

Репутация: нет
Всего: 71



Что никто не знает? Где же разрабочики Охотника?


--------------------
Быстро поднятое - упавшим не считаеся
PM MAIL ICQ MSN   Вверх
-=Ustas=-
Дата 27.11.2005, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



Я недавно такое себе делал, решил данную задачу следующим образом:
Код

$sql = "SELECT
                    ibf_members.id,
                    ibf_members.member_login_key,
                    ibf_members.mgroup,
                    ibf_members.name,
                    ibf_members.email,
                    ibf_groups.g_view_board
                FROM
                    ibf_members
                LEFT JOIN
                    ibf_groups
                ON
                    ibf_members.mgroup = ibf_groups.g_id
                WHERE
                    ibf_members.name = '".mysql_escape_string($_POST['login'])."'";
        $res = mysql_query($sql);
        if (mysql_num_rows($res) == 0) {
            // Если такого юзера нет, то посылаем нах...
            // Header("location: ".$HostName."forum/index.php?act=Login&CODE=01&CookieDate=1");
            exit();
        } else {
            $info = mysql_fetch_object($res);
        }
        $sql = "SELECT
                    converge_id,
                    converge_pass_hash,
                    converge_pass_salt
                FROM
                    ibf_members_converge
                WHERE
                    converge_email = '".$info->email."'";
        $res = mysql_query($sql);
        $converge = mysql_fetch_object($res);

        if ($converge->converge_pass_hash ==
            (md5(md5($converge->converge_pass_salt).md5($_POST['password'])))) {
            echo "Logined success!";
        } else {
            echo "Invalid user, replace and press any key!!!"; // :)
        }



--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
2man
Дата 27.11.2005, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2007
Регистрация: 6.5.2005
Где: Нижние Чигири

Репутация: нет
Всего: 71



Хм... ясно. Но боюсь программа не поймет никаких PHP-скриптов, поэтому сам скрипт мне надо выкладывать в отдельный файл. Остальные атрибуты скрипта мне брать с оригинального do_log_in и вместо стандартной авторизации вставлять свою?


--------------------
Быстро поднятое - упавшим не считаеся
PM MAIL ICQ MSN   Вверх
-=Ustas=-
Дата 27.11.2005, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



Я тебе выложил скрипт не для использования, а для наглядного образца SQL-запросов процесса авторизации... smile


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
2man
Дата 28.11.2005, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2007
Регистрация: 6.5.2005
Где: Нижние Чигири

Репутация: нет
Всего: 71



Ну хоть на том спасибо. Дальше сам додумаю ;)


--------------------
Быстро поднятое - упавшим не считаеся
PM MAIL ICQ MSN   Вверх
-=Ustas=-
Дата 28.11.2005, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



Цитата(2man @ 28.11.2005, 02:38)
Дальше сам додумаю ;)

Да что думать?! smile У тебя SQL-запросы уже готовые, используй их точно также, а в чём ты там пишешь - разницы нет! smile


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
-=Ustas=-
Дата 28.11.2005, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



Ну вот смотри. Делаем сначала проверку пользователя (не знаю правда на чём ты там пишешь, но тебе самое главное алгоритм):
Код

        $sql = "SELECT
                    ibf_members.id,                    
                    ibf_members.mgroup,
                    ibf_members.name, // Это поле для сравнения с введенным логином
                    ibf_members.email // Это поле нужно для выборки хеша авторизации                    
                FROM
                    ibf_members
                LEFT JOIN
                    ibf_groups
                ON
                    ibf_members.mgroup = ibf_groups.g_id
                WHERE
                    ibf_members.name = '".mysql_escape_string($_POST['login'])."'"; // Введенный пользователем логин
        $res = mysql_query($sql); // Выполняем запрос
        if (mysql_num_rows($res) == 0) { // Проверяем, есть ли вообще в БД юзер с таким именем
            // Если такого юзера нет, то посылаем нах...
            // Header("location: ".$HostName."forum/index.php?act=Login&CODE=01&CookieDate=1");
            exit();
        } else {
            $info = mysql_fetch_array($res); // Если есть, то забиваем массив с его инфой, в частности нам нужно мыло
        }
        $sql = "SELECT // Делаем выборку для сравнения хешей
                    converge_id,
                    converge_pass_hash,
                    converge_pass_salt
                FROM
                    ibf_members_converge
                WHERE
                    converge_email = '".$info['email']."'"; // Сравнение идет по мылу
        $res = mysql_query($sql);
        $converge = mysql_fetch_array($res); // Забиваем выбранный хеш в массив

        if ($converge['converge_pass_hash'] ==
            (md5(md5($converge['converge_pass_salt']).md5($_POST['password'])))) { // Делаем проверку полученных нами хешей
            // Если они совпали, значит с юзером всё в поряде. Далее делаем ему выборку новых сообщений, т.е. новых топиков
            $sql = "SELECT
                        tid,
                        title,
                        posts,
                        last_post,
                        forum_id
                    FROM
                        ibf_topics                    
                    ORDER BY
                        last_post // сортируем по дате сообщений
                    DESC
                    LIMIT 50 // например 50 последних сообщений
                    ";
            // Далее всё забиваешь в цикле в массив и выводишь юзеру.
        } else {
            // А если же хеши не совпали, то сообщаешь ему, что мол извините, так и так, произошло маленькое недоразумение...
            echo "Invalid user, replace and press any key!!!"; // :)
        }

В принципе, тебе алгоритм должен быть ясен, а начем уже уже его реализовывать - разницы нет, выдь ты через SQL работаешь?


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
2man
Дата 28.11.2005, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2007
Регистрация: 6.5.2005
Где: Нижние Чигири

Репутация: нет
Всего: 71



-=Ustas=-, да сам смысл я понял. Программа пишется на Делфях. Вопрос в том, поймет ли программа этот код. Попробую, потом скажу


--------------------
Быстро поднятое - упавшим не считаеся
PM MAIL ICQ MSN   Вверх
-=Ustas=-
Дата 28.11.2005, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



SQL конечно же поймет.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
2man
Дата 28.11.2005, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2007
Регистрация: 6.5.2005
Где: Нижние Чигири

Репутация: нет
Всего: 71



Ну тогда думаю проблем не возникнет smile А как научить распознавать первое поле как $_post['login'] а второе $_post['password']


--------------------
Быстро поднятое - упавшим не считаеся
PM MAIL ICQ MSN   Вверх
-=Ustas=-
Дата 28.11.2005, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



Блин, ну ты же говоришь, что в делфях пишешь?! Значит соотвественно login.text и password.text, или я тебя неправильно понял?

P.S. Уважаемые модераторы, сорьки за оффтоп! smile


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
2man
Дата 28.11.2005, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2007
Регистрация: 6.5.2005
Где: Нижние Чигири

Репутация: нет
Всего: 71



Не совсем так. На делфи пишет другой человек, которому я должен все правильно и понятно объяснить. Сам я в делфи не понимаю, поэтому и спрашиваю smile


--------------------
Быстро поднятое - упавшим не считаеся
PM MAIL ICQ MSN   Вверх
-=Ustas=-
Дата 28.11.2005, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



Дай ему SQL-запрос, он поймет.... smile


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
rkit
Дата 10.8.2007, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



-=Ustas=-

Делаю связку IPB + сайт.
Слушай подскажи пожалуйста как организовать проверку.
Тоесть если зарегин на форуме чел, то пустить его на сайт.
Надо в куки проверять,  подскажи как ?
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1387 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.