Механизм:
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 часа, зашёл с другого барузера и его не пустило.
Хорошим решением, с моей точки зрения, является вот такой алгоритм. При входе для каждого пользователя создаём сигнатуру из 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 - всё в порядке, можно проходить.
Очень просто, но всё будет работать.
1) При входе юзера на сайт изменяете значение в БД с 0 на 1.
2) При logout удаляются все сессионные данные, а с ними 1 меняется на 0.
3) При каждом входе делается проверка на параметр 1 или 0. Если 1 - пишем что-то типа "аккаунт уже используется на другом компе". Если 0 - всё в порядке, можно проходить.
Очень просто, но всё будет работать.
Спустя 47 минут, 50 секунд (6.12.2010 - 20:14) DySprozin написал(а):
ancient mariner
и через сколько времени осуществлять _автоматический_ logout?))
и через сколько времени осуществлять _автоматический_ 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) Человек не сможет зайти под своим ником дома (;
ну вот смотри: зашел человек в универе под своим ником. а выйти забыл... Теперь:
1) Этим ником может пользоваться кто угодно неограниченно долго.
2) Человек не сможет зайти под своим ником дома (;
Спустя 2 дня, 4 часа, 9 минут, 50 секунд (9.12.2010 - 13:44) respublika написал(а):
автоматический logout после того как время жизни сессии закончилось.
Спустя 6 часов, 25 минут, 41 секунда (9.12.2010 - 20:10) DySprozin написал(а):
respublika
кэп))
кэп))
_____________
..Работает - не трогай!