Перейти к контенту
  • 0

пароли на форуме 2.0.0 ?


Anna

Вопрос

Мне вот надо сделать один сервис, который работал бы только для зарегистрированных на форуме аккаунтов. Для этого мне нужно, чтобы вводимый пользователем пароль сверялся с тем (зашифрованным), который хранится в базе в таблице ibf_members.

Я заметила, что в 2.0 вместо одного поля с паролем, стало два:

legacy_password

member_login_key

 

Забавен факт, что для части пользователей (которые регились еще до апгрейда 1.3->2.0) пароль лежит во втором поле, зашифрованный функцией MD5() . А для пользователей, которые регились уже после апгрейда, эта схема не работает.

 

Подскажите пожалуйста, какова система хранения паролей? В чем логика? Как сравнить введенный пароль с имеющимся в базе?

Спасибо

 

П.С. Сейчас у меня стоит такая проверка, но она работает только для "старых" юзеров:

 

if (  ($row['member_login_key'] == md5($input_password)) || ($row['legacy_password'] == md5($input_password)) )

($row - это строка данный из SQL запроса по таблице пользователей)

по всей видимости первая часть некорректна...

Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0

открываем файл sources/register.php

вот как происходит добавление пароля (проверки на длину опущены):

	 $in_password = trim($ibforums->input['PassWord']);
 $salt     = $ibforums->converge->generate_password_salt(5);
 $passhash = $ibforums->converge->generate_compiled_passhash( $salt, md5($in_password) );
 $converge = array( 'converge_email'     => $in_email,
        'converge_joined'    => time(),
        'converge_pass_hash' => $passhash,
        'converge_pass_salt' => str_replace( '\\', "\\\\", $salt )
      );
 $DB->do_insert( 'members_converge', $converge );

 

:D то есть информация кладется в таблицу 'members_converge'

аналогия по сравнению думаю ясна? ;)

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Пока что-то не очень. А кто из них реальный пароль? 'converge_pass_hash' ?

 

т.е. $salt - мне нужно взять из таблицы 'members_converge'

запросить пароль, а потом сделать:

$passhash = $ibforums->converge->generate_compiled_passhash( $salt, md5($in_password) );

?

Ссылка на комментарий
Поделиться на других сайтах

  • 0

верно

 

 

как вариант, смотрим файл sources/login.php

	 $password = md5( $ibforums->input['PassWord'] );
 if ( $ibforums->converge->converge_authenticate_member( $password ) != TRUE )
 {
	 $this->log_in_form( 'wrong_pass' );
 }
// до этого выдергивается $member
 if ( ! $member['member_login_key'] )
 {
	 $member['member_login_key'] = $ibforums->converge->generate_auto_log_in_key();

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

Ссылка на комментарий
Поделиться на других сайтах

  • 0

все вроде бы понятно, только вот не знаю где искать данный класс..

 

$passhash = $ibforums->converge->generate_compiled_passhash( $salt, md5($in_password) );

 

хотелось бы сделать так, чтобы можно было не зависимо от форума обрабатывать:

$ibforums->converge->generate_compiled_passhash( $salt, md5($in_password) );
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Выкладываю авторизацию для 2.0.х

 

$login - ввод логина

$password - ввод пароля

 

  $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 );
}

 

 

Heckfy - забей на класс. Вот тебе твоя функция - generate_compiled_passhash - она маленькая и простая.

 

И еще обратите внимание, что объект $DB тут не участвует, т.е. тебе форум вообще нафиг не нужен. Тут напрямую с базой идет работа.

 

Мною опробовано. Юзаю уже год на сайте.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Как раз это мне и надо было, большое спасибо сэкономили мое время;)[1117710517:1117715881]Модифицировал данный код для ЭКОНОМЩИКОВ запросов БД:D

кому-нибудь может и пригодится..

 

----------------------

$name - имя введенное пользователем;

$pass - введенный пароль.

 

$r = mysql_query("SELECT m.id, m.name, c.converge_pass_hash, c.converge_pass_salt FROM ibf_members m, ibf_members_converge c WHERE m.name='${name}' AND m.id=c.converge_id") or die("Ошибка запроса");
if (@mysql_num_rows($r)!=1) {die("Не правильно задан логин!");}
list($id, $name, $converge_passhash, $converge_passsalt) = mysql_fetch_row($r);
$passhash = gen_passhash($converge_passsalt,md5($pass));
if ($converge_passhash != $passhash ) {die("Не правильно задан пароль!");}

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

 

Если заметите ошибки, то попраьте.

 

Огромное спасибо Анне и Сереге :)

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Паждите...

Этот скрипт типа можно использовать для разных там своих скриптов?

т.е. я хочу написать какой-нибудь скрипт

например АФИШИ или чего-то там еще или просто для сайта

и можно использовать его?

т.е. на сайте чел ввёнл лог и пасс через этот скрипт и данные беруться из базы мемберов форума? а можно же будет переделать аутендификацию любого скрипта под эту?( под форум)

спасибо

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Ну типа того, только die() -имхо это грубовато :D

Можно просто возвращать код ошибки и обрабатывать его, выводя нужное сообщение.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

согласен

:D

нада что бы как везде

"Не хотите зарегица?": ) А может Вы забыли пароль!? ;)

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Паждите...

Этот скрипт типа можно использовать для разных там своих скриптов?

т.е. я хочу написать какой-нибудь скрипт

например АФИШИ или чего-то там еще или просто для сайта

и можно использовать его?

т.е. на сайте чел ввёнл лог и пасс через этот скрипт и данные беруться из базы мемберов форума? а можно же будет переделать аутендификацию любого скрипта под эту?( под форум)

спасибо

 

совершенно верно, я таким образом скрестил свой чат с форумом и с другими разделами.

 

Ну типа того, только die() -имхо это грубовато :D

Можно просто возвращать код ошибки и обрабатывать его, выводя нужное сообщение.

 

это уже по вкусу ;) лично я использую функцию error() которая показывает всяческие ошибки и сообщения.

 

согласен

:)

нада что бы как везде

"Не хотите зарегица?": ) А может Вы забыли пароль!? :)

 

тоже можно ;)

 

А кто-нибудь знает, зачем тогда нужен legacy_password, который хранится в общей таблице?

 

не уверен на все сто, но по моему она нам больше не нужна, по крайней мере мне:)

 

А можно как-нибудь переконвертировать в обычные пароли?

 

а зачем? не советую.. ради безопасности пользователей и себя.

а в общем можно, только придется файл регистрации немного поправить, а так же авторизацию..

Ссылка на комментарий
Поделиться на других сайтах

  • 0
извините но немогли бы расказать в чём проблема. я тему почитал но в чём вопрос так и не понял...

 

 

мне тоже очень интересно...

Ссылка на комментарий
Поделиться на других сайтах

  • 0

когда я создавала эту тему, мне надо было понять каким образом происходит авторизация на форуме, чтобы сделать свой модуль безопасности, реализующий интеграцию ряда моих примочек для сайта с форумом (чтобы использовать базу пользователей логины+пароли для разделения доступа к этим самым примочкам).

 

Что в итоге получилось, вот в этом посте:

пароли на форуме 2.0.0 ? (пост 7)

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Немного новой информации - к вопросу о безопасности.

Т.к. осуществляется поиск пользоватся в базе по логину, делается очистка с помощью штатной (слегка модифенной) функции 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("/([0-9]+);/s", "\\1;", $val );

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

Изменено пользователем Anna
Ссылка на комментарий
Поделиться на других сайтах

  • 0
а зачем что-то придумывать? может лучше отдать данные из формы логина форуму? он сам обработает запишет ответ в куки... потом редиректнуть на сайт(страницу с которой был отдан запрос) и считать инфу из куков естественно все предворительно проверив а конкретно хэш пароля из куки по member_id тож их куки... :D
Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.