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

Сбрасывать ключ авторизации пользователей при каждом входе


Вопрос

Здравствуйте. Проблема такая: нужно, чтобы в случае, если кто-то сидит под чужим аккаунтом истинный владелец об этом как-то узнавал.

 

2,3,6

 

В настройках включено

Сбрасывать ключ авторизации пользователей при каждом входе

Если опция включена, то каждый раз при успешной авторизации пользователя ключ авторизации пользователя в cookies, используемый как пароль, будет сброшен. Таким образом невозможно одновременно авторизоваться на форуме с более, чем одного компьютера.

 

Но я могу сидеть в своем акке и с Мозиллы, и с Экслорера, также захожу с другой учетки винды - и там тоже могу еще раз с Мозиллы авторизоваться. Т.е. с трех мест могу сидеть на своем акке. А нужно, чтобы слетало все остальное.

 

Можно ли как-то сделать, чтобы при авторизации для аккаунта сбрасывались все остальные авторизации?

 

П.С.

И еще добавочка: когда я сидел с трех браузеров, в таблице sessions на мой акк было три записи. Я стер их все - и все равно при обновлении браузера авторизация не слетела, а эти записи появились в базе снова. Т.е. надо как-то сделать, чтобы ключ в куках пользователя перестал работать. Если штатными средствами этого не достичь (запрета сидения в акке с разных браузеров) - то предлагайте за сколько примерно денег вы можете это реализовать. Т.е. надо, чтобы если происходит авторизация в акк - все остальные авторизации слетали нафиг.

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

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

  • 0

ключ авторизации в таблице ibf_members - member_login_key, если куки прошли проверку по этому ключу, то в таблицу сессий все попадает

включи галочку сверять по браузеру

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

  • 0

Сверять по браузеру у меня и так стоит, ничего не сбрасывается. Тогда получается нужно изменить процесс авторизации. После успешной проверки логина-пароля должен создаваться новый мембер-логин-ки, и после этого только пользователь должен получать куки

 

закомментил

 

if ( $this->ipsclass->vars['login_change_key'] OR ! $member['member_login_key'] OR ( $this->ipsclass->vars['login_key_expire'] AND ( time() > $member['member_login_key_expire'] ) ) )
	{
		$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'],
		 												  'member_login_key_expire' => $_time ), 'id='.$member['id'] );
	}

 

и написал

 

$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'],
		 												  'member_login_key_expire' => $_time ), 'id='.$member['id'] );

 

т.е. всегда при авторизации должно это выполняться - и все равно сижу с двух браузеров в 1 акке

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

  • 0

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

 

Там получается так: если логиниться с разных ип адресов в один аккаунт - создается 2 сессии. И каждый проходит функцию auto-login по своей сессии. И хотя member_login_key и сменен - злоумышленник авторизуется по своей сессии и без этого ключа. И после этого еще и получает новую куку pass_hash с новым значением member_login_key и в результате контролирует украденный аккаунт веки вечные.

 

Выход вижу такой: нужно при авторизации не только менять member_login_key (что уже сделано, проверил - меняется), но и портить все другие сессии для этого аккаунта. Можно их просто удалить - но мне надо видеть, если сидят одновременно с акка 2 человека. Поэтому мне нужно именно испортить все остальные сессии.

 

Т.е. нужно прописать в конец авторизации запрос к базе, который выбирал бы все сессии где

 

member_id = нашему аккаунту

session_id != нашей сессии (т.е. все другие сессии, если они есть)

 

И запортить ключ сессии - т.е. записать туда любое значение

 

Вот допустим код, его нужно переделать:

 

$this->ipsclass->DB->do_update( 'sessions',
												 array (
														 'member_name'  => $member['members_display_name'],
														 'member_id'    => $member['id'],
														 'running_time' => time(),
														 'member_group' => $member['mgroup'],
														 'login_type'   => $privacy
													   ),
												 "id='".$session_id."'"
											 );

 

переделанный:

 


//генерируем случайную сессию
$random_session = md5( uniqid(microtime()) );

//Портим все другие рабочие сессии
$this->ipsclass->DB->do_update( 'sessions',
					array (
						 'id'  => $random_session,
					   ),
					 "member_id ='".$this->ipsclass->member['id']."' and id !='".$session_id."'"
											 );

 

Проверьте пожалуйста мой вывод и запрос

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

  • 0

Добавил код, работает. Правда только сначала. При авторизации в другом браузере слетает авторизация, соответственно пользователь сразу подозревает, что с его акка сидят.

 

Но если еще раз заавторизоваться вылезает ошибка БД. Я думаю это из-за того, что если "других" сессий, которые нужно испортить, больше 1, то нельзя им всем присвоить одно и тоже значение, т.к. сессия должна быть уникальна.

 

Т.е. нужно организовать в цикле обход всех "других" и каждой из них присвоить новое уникальное значение.

 

Что-то типа:

 

				$this->ipsclass->DB->simple_construct( array( 'select' => 'id', 'from' => 'sessions', 'where' => 'member_id ='' . $this->ipsclass->member['id'] . '' and id !='' . $session_id . ''') );

			$this->ipsclass->DB->simple_exec();

			while($id_of_session_exists = $this->ipsclass->DB->fetch_row())
			{
				$random_session = md5( uniqid(microtime()) );

				$this->ipsclass->DB->do_update( 'sessions',
                                               array (
                                                        'id'  => $random_session,
                                                  ),
                                                "id ='".$id_of_session_exists['id']."'"
                                                                                                );
			}

 

можете проверить этот код

особенно интересует можно ли делать запросы к базе в то время, когда идет цикл fetch_row, и если это нельзя - то можно наверно сначала записать все значения "других" сессий в массив, а потом в цикле их испортить

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

  • 0

                                $this->ipsclass->DB->simple_construct( array( 'select' => 'id', 'from' => 'sessions', 'where' => 'member_id ='' . $this->ipsclass->member['id'] . '' and id !='' . $session_id . ''') );

                               $this->ipsclass->DB->simple_exec();

                                  $i_123 = 0;

                               while($id_of_session_exists = $this->ipsclass->DB->fetch_row())
                               {
                                  $massiv_sessii['$i_123'] = $id_of_session_exists['id'];
                                  $i_123 = $i_123 + 1;

                               }

foreach( $massiv_sessii as $sessia_k_porche )
{
                                       $random_session = md5( uniqid(microtime()) );

                                       $this->ipsclass->DB->do_update( 'sessions',
                                               array (
                                                        'id'  => $random_session,
                                                  ),
                                                "id ='".$sessia_k_porche."'"
                                                                                                );
}

 

?

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

  • 0

                                $this->ipsclass->DB->simple_construct( array( 'select' => 'id', 'from' => 'sessions', 'where' => "member_id ='".$this->ipsclass->member['id']."' and id !='$session_id'") );

                               $this->ipsclass->DB->simple_exec();

                                  $i_123 = 0;

                               while($id_of_session_exists = $this->ipsclass->DB->fetch_row())
                               {
                                  $massiv_sessii[$i_123] = $id_of_session_exists['id'];
                                  $i_123 = $i_123 + 1;

                               }


foreach( $massiv_sessii as $sessia_k_porche )
{
                                       $random_session = md5( uniqid(microtime()) );

                                       $this->ipsclass->DB->do_update( 'sessions',
                                               array (
                                                        'id'  => $random_session,
                                                  ),
                                                "id ='".$sessia_k_porche."' and member_id ='".$this->ipsclass->member['id']."'"
                                                                                                );
}

 

вроде пашет

 

update

какая-то ошибка бд стала вылезать, пока отрубил изменения

 

update2

похоже не из-за этого ошибка была, но надо еще потеститровать.

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

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

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

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

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

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

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

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

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

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

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

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