Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Запретить доступ с нескольких интерфейсов
Форумы портала PHP.SU » » Работа с сетью » Запретить доступ с нескольких интерфейсов

Страниц (2): [1] 2 »
 

1. ferro - 14 Августа, 2011 - 23:49:00 - перейти к сообщению
Собственно, возникла проблема с тем, чтобы запретить пользователям единовременный доступ с разных интерфейсов (разных браузеров, компьютеров). Каким образом можно рвать старые сессии пользователя? Так как когда пользователь оставил сессию открытой дома и зашёл на сайт с работы разорвать его старую сессию(чтобы дома вылетела авторизация)?
2. КЫР - 15 Августа, 2011 - 00:06:55 - перейти к сообщению
если я правильно понял задачу, то создаем в таблице пользователей поле key (случайное число, 4 знаков должно хватить), при каждой аутентификации сравнивать значение этого поля с сохраненным в куках. Если соответствует - пропускаем пользователя, меняем key на рандомный и это же значение сохраняем в куках. Если не соответствует - выдаем форму.
3. ferro - 15 Августа, 2011 - 00:18:48 - перейти к сообщению
КЫР пишет:
если я правильно понял задачу, то создаем в таблице пользователей поле key (случайное число, 4 знаков должно хватить), при каждой аутентификации сравнивать значение этого поля с сохраненным в куках. Если соответствует - пропускаем пользователя, меняем key на рандомный и это же значение сохраняем в куках. Если не соответствует - выдаем форму.

я могу хранить уникальный сид в базе и при каждом обращении проверять его, если он изменился рвать сессию но ведь тогда при каждой проверке придётся обращаться к базе..
4. LIME - 15 Августа, 2011 - 00:24:18 - перейти к сообщению
.
5. ferro - 15 Августа, 2011 - 00:30:33 - перейти к сообщению
LIME пишет:
ferro если вы используете сессии то они уничтожаются при закрытии браузера
(Добавление)
я кажется всеже непонял ))
ненадо специально создавать куку
можно использовать phpsessid
его и писать в базу

проблема в том, что сессия остаётся открытой до закрытия окна браузера и если, допустим, открыть другой браузер или зайти с другого компьютера можно одновременно сидеть под одним аккаунтом с разных мест. По поводу хранения SID'a в базе и верификации при каждом обращении это неплохая идея, но как ограничить количество запросов к базе ведь тогда мне придётся на каждую проверку лезть в базу за текущим SID'ом пользователя?
6. LIME - 15 Августа, 2011 - 00:47:35 - перейти к сообщению
это понятно ...невнимательно прочитал
имхо полюбому както придется сохранять статус
думаю можно для этих целей завести файл с списком логинов и временем последнего обращения онлайн и при входе либо не пускать либо убивать предыдущую сессию
и пробегать каждый раз при авторизации список для сбора мусора по времени посещения
это навскидку можно оптимизировать наверняка но полюбому быстрее обращения к бд
или местный sqlite поставить с отдельной таблицей
7. ferro - 15 Августа, 2011 - 00:51:12 - перейти к сообщению
LIME пишет:
это понятно ...невнимательно прочитал
имхо полюбому както придется сохранять статус
думаю можно для этих целей завести файл с списком логинов и временем последнего обращения онлайн и при входе либо не пускать либо убивать предыдущую сессию
и пробегать каждый раз при авторизации список для сбора мусора по времени посещения
это навскидку можно оптимизировать наверняка но полюбому быстрее обращения к бд
или местный sqlite поставить с отдельной таблицей

мне как раз посоветовали кешировать результаты такого запроса на другом форуме, только я пока не слишком представляю как это можно организовать без застоя мусора по поводу sqlite я не очень понял, хотя честно пошёл искать на википедии
8. LIME - 15 Августа, 2011 - 00:56:58 - перейти к сообщению
ferro пишет:
как это можно организовать без застоя мусора
при каждом обращении пользователя записывать в тот самый файл это время
и при авторизации любого пользователя проверять все записи на время
если более некоторого значения то стирать запись
только надо вставить в страницу таймер с ajax запросом чтобы обновлял запись если пользователь просто отошел от компа
ferro пишет:
по поводу sqlite я не очень понял
это бд которая очень легкая и устанавливается в папку рядом с скриптом
для простейших задач то что надо
(Добавление)
http://www.php.su/functions/?cat=sqlite
9. ferro - 15 Августа, 2011 - 01:01:15 - перейти к сообщению
LIME пишет:
ferro пишет:
как это можно организовать без застоя мусора
при каждом обращении пользователя записывать в тот самый файл это время
и при авторизации любого пользователя проверять все записи на время
если более некоторого значения то стирать запись
только надо вставить в страницу таймер с ajax запросом чтобы обновлял запись если пользователь просто отошел от компа
ferro пишет:
по поводу sqlite я не очень понял
это бд которая очень легкая и устанавливается в папку рядом с скриптом
для простейших задач то что надо

Спасибо, думаю очень полезной будет идея с таймером на аяксе. Я просто встрою её в главный фрейм и буду разрывать сессию через некоторое время.
10. LIME - 15 Августа, 2011 - 01:16:52 - перейти к сообщению
я вот еще что подумал
лучше не 1 файл делать а папку с файлами с именем логин
и писать в них только время посещения
так быстрее
а если юзеров не очень много можно их и не удалять
можно в них писать сид со всеми вытекающими
(Добавление)
а если даже и много юзеров то можно разбить папку на подпапки по первым буквам логина
(Добавление)
последний вариант тем лучше что нужно обращаться к эти файлам только при авторизации и не надо чистить
11. ferro - 15 Августа, 2011 - 01:39:19 - перейти к сообщению
LIME пишет:
я вот еще что подумал
лучше не 1 файл делать а папку с файлами с именем логин
и писать в них только время посещения
так быстрее
а если юзеров не очень много можно их и не удалять
можно в них писать сид со всеми вытекающими
(Добавление)
а если даже и много юзеров то можно разбить папку на подпапки по первым буквам логина
(Добавление)
последний вариант тем лучше что нужно обращаться к эти файлам только при авторизации и не надо чистить

в каком смысле только при авторизации? ведь проверять придётся при каждой проверке на сессию, а при авторизации просто перезаписывать sid
12. LIME - 15 Августа, 2011 - 01:59:12 - перейти к сообщению
оооййй блииииннн
вот я нагородил)))
надо поспать))
храним сид в отдельном поле в обычной базе ))
просто не запрашиваем каждый раз а только при авторизации
подробнее:
зашел юзер -стартуем сессию- смотрим старый сид и уничтожаем сессию с этим сид- новый сид пишем в базу-
таким образом они будут выкидывать друг друга
а можно проверять на существование сессии со старым сид и не пускать нового если старая еще активна
в итоге запрос только при авторизации...
13. ferro - 15 Августа, 2011 - 02:43:32 - перейти к сообщению
LIME пишет:
оооййй блииииннн
вот я нагородил)))
надо поспать))
храним сид в отдельном поле в обычной базе ))
просто не запрашиваем каждый раз а только при авторизации
подробнее:
зашел юзер -стартуем сессию- смотрим старый сид и уничтожаем сессию с этим сид- новый сид пишем в базу-
таким образом они будут выкидывать друг друга
а можно проверять на существование сессии со старым сид и не пускать нового если старая еще активна
в итоге запрос только при авторизации...

но ведь тогда уничтожить старую сессию невозможно если пользователь не выйдет или не закроет браузер, они не смогут друг друга выкидывать..или я чего-то не понимаю? возможно ли зная сид удалить сессию с таким сидом?
14. LIME - 15 Августа, 2011 - 03:42:58 - перейти к сообщению
во-первых можно напрямую удалить файл с таким именем
sess_1pgqnanp81e10k9oo2b58afu22
после подчеркивания идет сид
но врядли вас пускают в систему...?
session_id() c параметром меняет текущую сессию
сразу после этого делаем дестрой и этот файл удалится

сессии есть ничто иное как набор файлов во временной папке ОС
в винде это WINDOWS/Temp в 'nix незнаю (а хотелось бы кстати)
в которых и хранятся все переменные сессии
15. ferro - 16 Августа, 2011 - 14:47:47 - перейти к сообщению
LIME пишет:
во-первых можно напрямую удалить файл с таким именем
sess_1pgqnanp81e10k9oo2b58afu22
после подчеркивания идет сид
но врядли вас пускают в систему...?
session_id() c параметром меняет текущую сессию
сразу после этого делаем дестрой и этот файл удалится

сессии есть ничто иное как набор файлов во временной папке ОС
в винде это WINDOWS/Temp в 'nix незнаю (а хотелось бы кстати)
в которых и хранятся все переменные сессии

большое спасибо за разъяснение о параметре session_id()! Если я правильно понял, можно с её помощью удалять предыдущую сессию пользователя зная её сид? Тоесть я просто читаю при логине его предыдущий SID из базы и разрушаю старую сессию вот так
session_id(SID);
session_destroy();
//а затем создаю уже новую текущую сессию
session_name('Name');
session_start();
Таким образом когда пользователь логинится в другом месте я уничтожаю его предыдущую сессию и его выкидывает при первой же проверке (для этого я использую тот же таймер на аяксе). Локально у меня получилось это реализовать, но я не уверен что правильно понял и на сервере всё получится также. В любом случае большое спасибо!

 

Powered by ExBB FM 1.0 RC1