Перейти к контенту
  • 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
Ссылка на комментарий
Поделиться на других сайтах

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

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

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

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

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

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

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

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

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