|
|
|
| Здравствуйте.
Встала очередной раз встала задача заблокировать "движения" пользователя если он не правильно ввёл данные на форме. Раньше делал через таблицу в БД, и если количество попыток превысило N раз, то ip блокируется на M минут.
Теперь пытаюсь сделать это через $_SESSION
Если количество попыток превысило допустимое (количество считается $_SESSION["shans"]++), то в переменную $_SESSION["user_guid"] помещаю провинившегося пользователя
Как определить время жизни переменной user_guid например в 30 минут? | |
|
|
|
|
|
|
|
для: Den*s
(03.08.2011 в 10:38)
| | Без базы данных пожалуй вам не обойтись. Сессия так и называется потому что существует до ее завершения (может и раньше, до закрытия браузера - это настраивается в php.ini). То есть если ваш провинившийся пользователь закроет браузер и вернется снова, для него уже не будет существовать значения $_SESSION["user_guid"]
Можно зашифровать это значение и забросить в кук, задав ему время жизни в 30 минут, но опять таки - простое удаление пользователем этого кука и вновь пользователь стал хорошим).
Но это мое мнение - возможно кто то не согласиться со мной) | |
|
|
|
|
|
|
|
для: metrolog
(03.08.2011 в 11:06)
| | Собственно, механизм сессий тоже базируется на куки (есть версия с прилеплением SID к ссылкам, но так никто уже не делает, кажется). Так что действительно, очистка куки сделает юзера хорошим.
Я бы делал блок по хэшу из идентификационных параметров вроде ip+user agent и хранил его в базе. | |
|
|
|
|
|
|
|
для: SHAman
(03.08.2011 в 11:17)
| | Думал раз $_SESSION хранится на сервере то будет более расширенный механизм, типа задал этой переменной жить столько и хранить то то, в не зависимости от пользователя, покинул он браузер или нет, чистит он у себя куки или нет и т.д.
Спасибо за ответы, вернусь к базе ... | |
|
|
|
|
|
|
|
для: Den*s
(03.08.2011 в 11:31)
| | вообще лично я бы блокировал саму учетную запись на пару минут, и не важно кто с каким ай-пи, с каким браузером и скакими куками "стучиться в дверь ко мне" | |
|
|
|
|
|
|
|
для: Valick
(03.08.2011 в 11:46)
| | >вообще лично я бы блокировал саму учетную запись на пару минут, и не важно кто с каким ай-пи, с каким браузером и скакими куками "стучиться в дверь ко мне"
Согласен! по моему самое грамотное решение. | |
|
|
|
|
|
|
|
для: Valick
(03.08.2011 в 11:46)
| | Да, пожалуй) Не подумал. | |
|
|
|
|
|
|
|
для: SHAman
(03.08.2011 в 12:08)
| | Ну да, так и сделал :) | |
|
|
|
|
|
|
|
для: 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 минут');
|
Если ты будешь блокировать запись через базу, то вдруг злоумышленник подбирает пароль от чужого аккаунта, а ты его заблокируешь, и настоящий владелец тоже будет в блоке. | |
|
|
|
|
|
|
|
для: Ванек2010
(03.08.2011 в 19:44)
| | то вдруг злоумышленник подбирает пароль от чужого аккаунта, а ты его заблокируешь, и настоящий владелец тоже будет в блоке
не вдруг, а так оно и есть, это простейшая защита от брутофорса
если делать серьезнее то нужно учитывать массу других факторов (например время между вводом первого и последующих паролей, совпадают они друг с другом или нет и тд)
и поверьте настоящему владельцу лучше увидеть надпись ваш аккаунт заблокирован на N-минут по причине попытки подбора пароля, чем не увидеть аккаунта совсем
а вот блокировка ай-пи, или ваша сессия для взломщика роли не сыграет совсем | |
|
|
|
|
|
|
|
для: Valick
(03.08.2011 в 20:27)
| | Кстати да, я ошибся) Все значения сессии удалятся, при удалении куков, проверил, извиняюсь | |
|
|
|
|
|
|
|
для: Ванек2010
(03.08.2011 в 20:59)
| | вы снова ошиблись, значения не удаляются, просто у вас стартует новая сессия
чистка устаревших сессий проводиться по хитровымудренному алгоритму и частота чистки зависит от количества устаревших сессий и еще фиг знает от чего, либо вы сами удаляете все переменные сессии и саму сессию.
можете запомнить SID идентификатор сессии (на этом и основан "угон" сессии) и попробовать удалить свою куку или даже закрыть браузер, а потом прописать в гет-параметре этот идентификатор (не позднее 15-20 минут, точнее время жизни сесии можно узнать в настройках РНР) и увидите свои переменные.
___
кстати при выходе одного session_destroy(); не достаточно, данные сессии физически осаются на диске и ждут утилизатора и хотя при этом их достать проблематично (либо ломануть сервер либо ломануть сайт нужно) всетаки обычно делают unset сессионных переменных, и только потом session_destroy(); | |
|
|
|