[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: защита от одновременного использования логина
maximka787
Привет всем. Я реализовал механизм, от защиты одновременного нахождения рег. пользователей, но не могу его доработать.
Механизм:
1. Проверка на наличие логина и пароля в базе. Если да то регистрируем переменную сессионную USER_ID

2. Сразу добавляем в БД запись SID и USER_ID и ВРЕМЯ (если строка есть, то обновляем время, если нет то создаем)

3. Как проверить лучше и правильней, чтобы один USER_ID ходил только под одним SID-ом?

я сделал что-то примерное
if (isset($_SESSION['valid_user'])){

$result = mysql_query(select * from session where userid = $USER_ID);
$row = mysql_fetch_array($result);
if($row['sid']!=$row['user_id']){
//форма ввода логина и пароля
unset($_SESSION['valid_user']);
exit;
}
// админ зона
}



правильно ли я сделал?



Спустя 13 часов, 14 минут, 7 секунд (30.11.2010 - 09:30) Белый Тигр написал(а):
Помоему нет. Код дословно представляется мне так - если есть ячейка valid_user, то проверяем наличие записей в session, которые определённо есть. Ну и первую сравниваем с текущей. Как-то так. Главный недостаток здесь в том, что раз сидит несколько человек под одним аккаунтом, значит и сессий несколько. А сверяется лишь первый результат выборки. То есть скорее всего, если 3 пользователя начнут одновременно заходить, их будет "выбрасывать" из приложения в случайном порядке. А лучше первого вошедшего всегда оставлять, а остальным просто запрещать заходить.
Хорошим решением, с моей точки зрения, является вот такой алгоритм. При входе для каждого пользователя создаём сигнатуру из IP и браузера. Например их совместный md5-хеш. Пишем это в таблицу. Когда кто-то входит в приложение, проверяем есть ли в БД данные по его id. Если нет - пусть заходит. Есть - проверяем совпадает ли хеш с тем что у пользователя. Ну и при каждом обращении пользователя к сайту обновляем время активности сессии. Чтоб не было такого что пользователь зашёл с одного браузера, потом от него действий не было 3 часа, зашёл с другого барузера и его не пустило.

Спустя 9 минут, 1 секунда (30.11.2010 - 09:39) linker написал(а):
Короче: логинится юзверь, записываешь в базу его сессионные данные и время последнего доступа (это время нужно обновлять при каждом переходе юзверя со страницы на страницу). Допустим другой юзверь тоже пытается залогиниться с теми же логином и паролем, что и первый. Проверяешь а есть ли в сессионных данных в базе запись про данного юзверя с адекватным последним временем доступа. Если есть, то отфутболиваешь, если нет или время последнего доступа слишком велико (> времени жизни сессии) то даешь залогиниться.

Спустя 25 минут, 33 секунды (30.11.2010 - 10:05) Basili4 написал(а):
можно проще но несколько по брутальней.

Даешь пользователю регатся. пишешь его данные в базу если он нажимает выход то запись удаляешь. Если кто пытается войти сверяешь есть ли или нет запись в базе.

Спустя 1 час, 54 минуты, 11 секунд (30.11.2010 - 11:59) maximka787 написал(а):
Спасибо, благодаря мнениям собрал код. Вот что-то примерное. Правильна логика?
//АВТОРИЗАЦИЯ (проверка на наличие логина и пароля в базе, далее
$sid = session_id();

//добавляем запись и обновляем дату (на всех страницах в начале)
$result1 = mysql_query("select * from sessions where sid='$sid'");
if(mysql_num_rows($result1) > 0){
mysql_query("update sessions set sdate = NOW() WHERE sid='$sid'");
}else{
mysql_query("insert into sessions values('$sid','$user_id', NOW())");
}
// проверка(на всех страницах) SID и ID
$result2 = mysql_query("select * from sessions where user_id='$user_id'");
$row = mysql_fetch_array($result2);
if($row['sid']!=$row['user_id']){
//loginform
session_destroy();
exit;
}

Спустя 4 минуты, 6 секунд (30.11.2010 - 12:03) waldicom написал(а):
Цитата (linker @ 30.11.2010 - 08:39)
Если есть, то отфутболиваешь, если нет или время последнего доступа слишком велико (> времени жизни сессии) то даешь залогиниться.

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

Спустя 3 минуты, 59 секунд (30.11.2010 - 12:07) maximka787 написал(а):
Цитата (maximka787 @ 30.11.2010 - 08:59)
Вот что-то примерное.

в этом коде как раз и идет "разлогивание" первого. То есть любой, кто зашел на сайт, ходит, пока кто-то новый не зайдет снова. Можно было и без процедуры проверки вообще реализовать проект, но если проект платный, то юзеры могут прокачать аккаунт и делать дела по одному логину.

Спустя 8 минут, 16 секунд (30.11.2010 - 12:15) linker написал(а):
waldicom
Об этом лучше сообщать админу сайта, но ни как не пользователю, он может тупо не понять, как в приведенному выше примере.

Спустя 2 минуты, 52 секунды (30.11.2010 - 12:18) maximka787 написал(а):
Цитата (linker @ 30.11.2010 - 09:15)
waldicom
Об этом лучше сообщать админу сайта, но ни как не пользователю, он может тупо не понять, как в приведенному выше примере.

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

Спустя 3 минуты, 4 секунды (30.11.2010 - 12:21) linker написал(а):
Админ может посмотреть, разобраться и например отписать юзверю, чтобы он на всякий случай сменил пароль. На то он и админ сайта.

Спустя 4 минуты, 32 секунды (30.11.2010 - 12:26) maximka787 написал(а):
Цитата (linker @ 30.11.2010 - 09:21)
Админ может посмотреть, разобраться и например отписать юзверю, чтобы он на всякий случай сменил пароль. На то он и админ сайта.

как вариант можно конечно, но система должна быть автоматическая все равно. на практике не будешь же ты постоянно сажать админов на все проекты)

Спустя 1 минута, 40 секунд (30.11.2010 - 12:27) linker написал(а):
НУ это ты сам смотри, но в твоем примере пользователя тупо выкинет на авторизацию и он нихрена не поймет, что под его аккаунтом кто-то сидит ибо все будет выглядеть так, как-будто кончилось время сессии.

Спустя 7 минут, 53 секунды (30.11.2010 - 12:35) waldicom написал(а):
Цитата (linker @ 30.11.2010 - 11:27)
...он нихрена не поймет, что под его аккаунтом кто-то сидит ибо все будет выглядеть так, как-будто кончилось время сессии.

Так я ведь написал:
Цитата
...с надписью, что такая учетная запись уже используется. Может помочь понять, что тебя поломали.

Не обязательно, что такое решение лучшее. Дополнительно можно конечно и админу автоматически отписать.

Спустя 17 минут, 30 секунд (30.11.2010 - 12:53) maximka787 написал(а):
надпись "учетная запись уже используется" это да, не хватает к моему коду это просто. а на счет админов, то опять же кроме как предупредить пользователя, он ничего не сможет сделать больше.

Спустя 6 дней, 6 часов, 33 минуты (6.12.2010 - 19:26) ancient mariner написал(а):
Простой, как варёная картошка, метод. Создаёте в БД дополнительное поле, со значениями 0, если юзер не в онлайне, и 1, если в онлайне.

1) При входе юзера на сайт изменяете значение в БД с 0 на 1.
2) При logout удаляются все сессионные данные, а с ними 1 меняется на 0.
3) При каждом входе делается проверка на параметр 1 или 0. Если 1 - пишем что-то типа "аккаунт уже используется на другом компе". Если 0 - всё в порядке, можно проходить.

Очень просто, но всё будет работать.

Спустя 47 минут, 50 секунд (6.12.2010 - 20:14) DySprozin написал(а):
ancient mariner
и через сколько времени осуществлять _автоматический_ logout?))

Спустя 3 часа, 25 минут, 23 секунды (6.12.2010 - 23:39) ancient mariner написал(а):
Цитата
и через сколько времени осуществлять _автоматический_ logout?))

Не понял вопроса. Зачем нужен автоматический logout?

Спустя 9 часов, 55 минут, 28 секунд (7.12.2010 - 09:34) DySprozin написал(а):
ancient mariner
ну вот смотри: зашел человек в универе под своим ником. а выйти забыл... Теперь:
1) Этим ником может пользоваться кто угодно неограниченно долго.
2) Человек не сможет зайти под своим ником дома (;

Спустя 2 дня, 4 часа, 9 минут, 50 секунд (9.12.2010 - 13:44) respublika написал(а):
автоматический logout после того как время жизни сессии закончилось.

Спустя 6 часов, 25 минут, 41 секунда (9.12.2010 - 20:10) DySprozin написал(а):
respublika
кэп))


_____________
..Работает - не трогай!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.