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
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Возможность включения и отключения сеанса с двух разных мест
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012 Откуда: Санкт-Петербург
Помог: 5 раз(а)
Суть идеи: У вас есть сайт на котором есть авторизация, я предлагаю добавить в меню пользователя функцию которая будет давать возможность запретить 2 сеанса с разных мест поясняю: допустим на ваш сайт зашел человек под ником Вася, а потом кто то попытался зайти за Васю из другого места(не с того браузера с которого зашел Вася)...
итог такого захода: За Васю сидят с разных мест, а Вася даже не подозревает об этом...
что будет в этой статье: Здесь я расскажу как сделать так что бы когда за Васю заходят 2 человека (то есть авторизирутся под его логином и паролем) тот кто был раньше вылетал из сессии...
Пути достижения: При авторизации создаётся кука, и каждый раз когда Вася переходит с одной страницы сайта на другую эта кука меняется (естественно только в том случае если у пользователя включена эта функция);
ну а теперь самое главное код(хотя идея наверно важнее ):
предпологается что раз у вас есть пользователи значит у вас настроено ЧПУ допустим все запросы обрабатывает файл index.php, к которуму уже подключен коннект к базе данных. Форма авторизации находится в login.php, куки хранятся в таблице coocie: id(int), login(id), name(warchar), date(int), life(int) поясняю:
login - id пользователя
name - уникальный идентификатор coocie
date - время создания куки из функции time()
life - время жизни куки(в секундах)
Так же есть таблица с пользователями пусть будет users: id, login(warchar), password(warchar), sess(int) поясняю:
sess - это наша функция (соотвественно 1 - включено, 0 - выключено)
остальное думаю очевидно
ах да чуть не забыл база данных называется EXAMPLE
И так все запросы вашего сайта перенаправляются в файл index.php там мы добавляем (напрямую или include) вот такой код:
if((strlen($_POST['login'])>0)and(strlen($_POST['password'])>0)){#login и password - имя формы от которой приходят запросы(можете менять под себя)
if((preg_match('#^[0-9a-zA-Zа-яА-я]{3,25}$#',$_POST['login']))and(preg_match('#^[0-9a-zA-Z]{3,25}$#',$_POST['password']))){# проверка логина и пароля на соответсвие(можете менять под себя)
$zapros='SELECT id, sess FROM `users` WHERE login =\''.$_POST['login'].'\' and password=\''.$_POST['password'].'\';';# запрос в таблицу users на соответствие логина и пароля
$random_value=md5(uniqid(rand(),1));# создаем новую рандомную переменную
$life=60;# определяем для неё жизнь
$zap='UPDATE `EXAMPLE`.`coocie` SET `name` = \''.$random_value.'\', `date` = \''.time().'\', `life` = \''.$life.'\' WHERE `coocie`.`login` =\''.$login_id.'\';';# Запрос на обновление данных о сессии
}else{# если не было найдено не пост не куки данных
$autorization=false;
}
?>
ЗЫ: расписал всё как мог подробно, строго не судите первая моя статья)
ЗЗЫ: делал пример из своего кода, максимально пытался сократить и оставить только самое главное (Добавление)
И конечно забыл добавить т.к. кука меняется каждый раз при просмотре страниц сайта один из пользователей под одним аком будет вылетать
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Код никак не решает проблемы, подробно обсужденной здесь http://forum.php.su/topic.php?fo...1&topic=6008 (да, впрочем, её не сможет решить никакой код) - потому смысла большого в таком построении не вижу.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Prizma
Отправлено: 02 Июля, 2012 - 18:59:30
Посетитель
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012 Откуда: Санкт-Петербург
Помог: 5 раз(а)
ты не прав... при авторизации с другого места кука изменится тоесть при переходе с первоначальной авторизацией авторизация слетит... не понял почему ты сказал что код проблемы не решает... так же появилась идея что можно изменить немного концепцию что бы каждый раз не менять куку можно менять куку только при авторизации (хотя это понизит уровень безопасности) тогда при получение пост данных куки данные изменятся и тот кто авторизировался раньше вылетит...
аргументируй почему это невозможно и код не работает... если ты имеешь ввиду то что как кто то зашел на сайт под твоим аком другому пользователю без переходов тут же вылетел eror это не так... но при переходе на другую страницу пользователь вернётся к авторизации если сраница заблокирована для гостей (ну или на главную от настроек сайта зависит) (Добавление)
Тип авторизации: куки
я не использую сессии... та тема на которую ты меня отправил рассматривает именно сессии... мне сессии не нравятся я пользуюсь куками как переменными сообщаемыми в браузер пользователя и только.
Мелкий
Отправлено: 02 Июля, 2012 - 19:02:09
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Да здравствуют SQL-инъекции! Если вы думаете, что их нет - ищите лучше. Огромная эксплуатируемая дыра и в таком ответственном коде.
Да здравствуют нотайсы. Включите вывод ошибок.
----- PostgreSQL DBA
Prizma
Отправлено: 02 Июля, 2012 - 19:08:59
Посетитель
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012 Откуда: Санкт-Петербург
Помог: 5 раз(а)
Мелкий пишет:
Да здравствуют SQL-инъекции! Если вы думаете, что их нет - ищите лучше. Огромная эксплуатируемая дыра и в таком ответственном коде.
Да здравствуют нотайсы. Включите вывод ошибок.
код для показания как использовать, по сути вот эта часть основная...
$random_value=md5(uniqid(rand(),1));# создаем новую рандомную переменную
$life=60;# определяем для неё жизнь
$zap='UPDATE `EXAMPLE`.`coocie` SET `name` = \''.$random_value.'\', `date` = \''.time().'\', `life` = \''.$life.'\' WHERE `coocie`.`login` =\''.$login_id.'\';';# Запрос на обновление данных о сессии
код я могу переписать если смысл имеет, я прост не уверен что эта статья будет кого то интересовать я написал в общих чертах принцип
Мелкий
Отправлено: 02 Июля, 2012 - 19:21:08
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Показывать надо хотя бы корректный пример. Защита с огромной дырой - защитой называться не может.
Prizma пишет:
в этом куске есть ошибки?
Кроме неинициализированной переменной - могло бы иметь место на жизнь, если бы не остальной код. А так - именно здесь вы открываете настежь дверь для всех.
----- PostgreSQL DBA
Prizma
Отправлено: 02 Июля, 2012 - 19:26:06
Посетитель
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012 Откуда: Санкт-Петербург
Помог: 5 раз(а)
Мелкий пишет:
Кроме неинициализированной переменной - могло бы иметь место на жизнь, если бы не остальной код. А так - именно здесь вы открываете настежь дверь для всех.
стоп стоп стоп где неинициализированная переменная? $sess:
$zapros='SELECT id, sess FROM `users` WHERE login =\''.$_POST['login'].'\' and password=\''.$_POST['password'].'\';';# запрос в таблицу users на соответствие логина и пароля
ЗЫ: я обсолютно поддерживаю критику, но пожалуйста больше конкретики, я не против доработать код если он имеет смысл... Мне ж самому интересно найти минусы кода и варианты его возможного усовершенствования как относительно скорости работы так и защиты
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Prizma
Какая разница - куки или сессии? Авторизация все равно основывается на данных, присланных клиентом. Перечитайте, пожалуйста, суть проблемы, описанной в той теме.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Мелкий
Отправлено: 02 Июля, 2012 - 19:33:33
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Prizma пишет:
стоп стоп стоп где неинициализированная переменная? $sess:
Уууу, батенька. Т.е. вас совершенно не смущает, что определение и использование переменной находятся во взаимоисключающих блоках условия?
----- PostgreSQL DBA
armancho7777777
Отправлено: 02 Июля, 2012 - 19:37:46
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012 Откуда: Санкт-Петербург
Помог: 5 раз(а)
Мелкий пишет:
Уууу, батенька. Т.е. вас совершенно не смущает, что определение и использование переменной находятся во взаимоисключающих блоках условия?
согласен) напортачил) в моём изначальном коде был ещё один блок я из него часть запихнул в else счас поправлю)
armancho7777777 пишет:
... просто ужас.
тебе кавычки не нравятся? прости привык использовать одинарные и символ экранизации... нечего не поделаешь (слышал что одинарыные работают быстрее двойных т.к. не идёт проверка на наличие переменных так и приучился использовать одинарные) или ужас в чем то другом? (Добавление)
поправил код... в первом посте
Мелкий пишет:
Уууу, батенька.
какое там) просто пхп нравится появилась идея вот не поленился "озвучить", критику послушать (Добавление)
Напомню что я конкретно этот код не тестил, я его получил упрощением своего кода, в моём коде немного другая концепция с доступом, поэтому эта переменная и вылезла...
всёравно не понял вот этого:
EuGen пишет:
Код никак не решает проблемы
EuGen пишет:
(да, впрочем, её не сможет решить никакой код)
(Добавление)
В моём рабочем примере происходит вот что(проверено могу залить на хост продемонстрировать):
1. Авторизируешься
2. Обновляешь страницу (без отправки пост данных) меняется кука и идентификатор в базе данных
3. заходишь с другого браузера авторизируешься
4. обновляешь страничку в первом браузере авторизация слетает т.к. кука изменилась и записалась уже в другом браузере
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
Prizma пишет:
тебе кавычки не нравятся?
Вы заметили только ковычки?)
Как Вы понимаете инициализацию переменных интересно)
P.S. И не надо тыкать....
Prizma
Отправлено: 02 Июля, 2012 - 20:00:05
Посетитель
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012 Откуда: Санкт-Петербург
Помог: 5 раз(а)
armancho7777777 пишет:
Вы заметили только ковычки?)
Как Вы понимаете инициализацию переменных интересно)
P.S. И не надо тыкать....
предпологается что они поступают в данный мною скрипт из формы разве это не очевидно?
armancho7777777
Отправлено: 02 Июля, 2012 - 20:00:31
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
Вы даже с EuGen-ом умидрились начать спорить ))
Нет слов))
Мелкий
Отправлено: 02 Июля, 2012 - 20:00:45
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Prizma пишет:
согласен) напортачил) в моём изначальном коде был ещё один блок я из него часть запихнул в else счас поправлю)
А теперь подумайте ещё раз, что вы получили
Копипаст - худший помощник разработчика.
И всё равно - где хоть какое-то экранирование данных? Почему, когда вы используете значения только одной строки, используете цикл? Уберите уже нотайсы из самого первого условия.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.