Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сколько живёт переменная $_SESSION
 
 автор: Den*s   (03.08.2011 в 10:38)   письмо автору
 
 

Здравствуйте.
Встала очередной раз встала задача заблокировать "движения" пользователя если он не правильно ввёл данные на форме. Раньше делал через таблицу в БД, и если количество попыток превысило N раз, то ip блокируется на M минут.
Теперь пытаюсь сделать это через $_SESSION
Если количество попыток превысило допустимое (количество считается $_SESSION["shans"]++), то в переменную $_SESSION["user_guid"] помещаю провинившегося пользователя
Как определить время жизни переменной user_guid например в 30 минут?

  Ответить  
 
 автор: metrolog   (03.08.2011 в 11:06)   письмо автору
 
   для: Den*s   (03.08.2011 в 10:38)
 

Без базы данных пожалуй вам не обойтись. Сессия так и называется потому что существует до ее завершения (может и раньше, до закрытия браузера - это настраивается в php.ini). То есть если ваш провинившийся пользователь закроет браузер и вернется снова, для него уже не будет существовать значения $_SESSION["user_guid"]
Можно зашифровать это значение и забросить в кук, задав ему время жизни в 30 минут, но опять таки - простое удаление пользователем этого кука и вновь пользователь стал хорошим).
Но это мое мнение - возможно кто то не согласиться со мной)

  Ответить  
 
 автор: SHAman   (03.08.2011 в 11:17)   письмо автору
 
   для: metrolog   (03.08.2011 в 11:06)
 

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

Я бы делал блок по хэшу из идентификационных параметров вроде ip+user agent и хранил его в базе.

  Ответить  
 
 автор: Den*s   (03.08.2011 в 11:31)   письмо автору
 
   для: SHAman   (03.08.2011 в 11:17)
 

Думал раз $_SESSION хранится на сервере то будет более расширенный механизм, типа задал этой переменной жить столько и хранить то то, в не зависимости от пользователя, покинул он браузер или нет, чистит он у себя куки или нет и т.д.

Спасибо за ответы, вернусь к базе ...

  Ответить  
 
 автор: Valick   (03.08.2011 в 11:46)   письмо автору
 
   для: Den*s   (03.08.2011 в 11:31)
 

вообще лично я бы блокировал саму учетную запись на пару минут, и не важно кто с каким ай-пи, с каким браузером и скакими куками "стучиться в дверь ко мне"

  Ответить  
 
 автор: metrolog   (03.08.2011 в 11:52)   письмо автору
 
   для: Valick   (03.08.2011 в 11:46)
 

>вообще лично я бы блокировал саму учетную запись на пару минут, и не важно кто с каким ай-пи, с каким браузером и скакими куками "стучиться в дверь ко мне"
Согласен! по моему самое грамотное решение.

  Ответить  
 
 автор: SHAman   (03.08.2011 в 12:08)   письмо автору
 
   для: Valick   (03.08.2011 в 11:46)
 

Да, пожалуй) Не подумал.

  Ответить  
 
 автор: Den*s   (03.08.2011 в 12:30)   письмо автору
 
   для: SHAman   (03.08.2011 в 12:08)
 

Ну да, так и сделал :)

  Ответить  
 
 автор: Ванек2010   (03.08.2011 в 19:44)   письмо автору
 
   для: Den*s   (03.08.2011 в 10:38)
 

Можно сделать как ты предложил, так будет правильнее.
Время жизни сессии увеличить можно в php.ini или так
ini_set('session.gc_maxlifetime', 120960); время жизни в сек сессионных переменных, твоей shans
ini_set('session.cookie_lifetime', 120960); время жизни в сек кукиса id сессии
Делаешь как написал $_SESSION["user_guid"] и все больше он не введет N кол-ва раз, удалит куки, сессия всеравно останется. Обрати внимание, если он войдет в аккаунт и выйдет, вызовется функция session_destory(); Соответственно все твои $_SESSION["user_guid"] пропадут.
При выходе надо проверить, либо запретить клацать кнопку выхода

<?php
if(!isset($_SESSION["user_guid"])) session_destroy();
else die(
'К сожаленью вы не сможете покинуть свой аккаунт, по истечению 15 минут');

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

  Ответить  
 
 автор: Valick   (03.08.2011 в 20:27)   письмо автору
 
   для: Ванек2010   (03.08.2011 в 19:44)
 

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

  Ответить  
 
 автор: Ванек2010   (03.08.2011 в 20:59)   письмо автору
 
   для: Valick   (03.08.2011 в 20:27)
 

Кстати да, я ошибся) Все значения сессии удалятся, при удалении куков, проверил, извиняюсь

  Ответить  
 
 автор: Valick   (03.08.2011 в 21:24)   письмо автору
 
   для: Ванек2010   (03.08.2011 в 20:59)
 

вы снова ошиблись, значения не удаляются, просто у вас стартует новая сессия
чистка устаревших сессий проводиться по хитровымудренному алгоритму и частота чистки зависит от количества устаревших сессий и еще фиг знает от чего, либо вы сами удаляете все переменные сессии и саму сессию.
можете запомнить SID идентификатор сессии (на этом и основан "угон" сессии) и попробовать удалить свою куку или даже закрыть браузер, а потом прописать в гет-параметре этот идентификатор (не позднее 15-20 минут, точнее время жизни сесии можно узнать в настройках РНР) и увидите свои переменные.
___
кстати при выходе одного session_destroy(); не достаточно, данные сессии физически осаются на диске и ждут утилизатора и хотя при этом их достать проблематично (либо ломануть сервер либо ломануть сайт нужно) всетаки обычно делают unset сессионных переменных, и только потом session_destroy();

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования