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 » PHP » Программирование на PHP » Возможность включения и отключения сеанса с двух разных мест

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

1. Prizma - 02 Июля, 2012 - 18:17:40 - перейти к сообщению
Суть идеи: У вас есть сайт на котором есть авторизация, я предлагаю добавить в меню пользователя функцию которая будет давать возможность запретить 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) вот такой код:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. if((strlen($_POST['login'])>0)and(strlen($_POST['password'])>0)){ #login и password - имя формы от которой приходят запросы(можете менять под себя)
  4.         if((preg_match('#^[0-9a-zA-Zа-яА-я]{3,25}$#', $_POST['login']))and(preg_match('#^[0-9a-zA-Z]{3,25}$#', $_POST['password']))){ # проверка логина и пароля на соответсвие(можете менять под себя)
  5.                 $zapros = 'SELECT id, sess FROM `users` WHERE login =\''.$_POST['login'].'\' and password=\''.$_POST['password'].'\';'; # запрос в таблицу users на соответствие логина и пароля
  6.                 $zapros = mysql_query($zapros);
  7.                 if(mysql_num_rows($zapros)>0){ # проверяем выдал ли нам что нибудь запрос
  8.                         while($row = mysql_fetch_array($zapros)){
  9.                                 $login_id = $row['id']; # извлекаем id из предыдущего запроса
  10.                         }
  11.                         $zapros = 'DELETE FROM `EXAMPLE`.`coocie` WHERE `coocie`.`login` = \''.$login_id.'\';'; # удаляем старые записи
  12.                         mysql_query($zapros);
  13.                         $random_value = md5(uniqid(rand(),1)); # создаем новую уникальную переменную для куки
  14.                         $life = 60; # определяем время жизни куки в секундах (в данном случае 60 секунд)
  15.                         $zapros = 'INSERT INTO `EXAMPLE`.`coocie` (`id` ,`login` ,`name` ,`date` ,`life`) VALUES (NULL, \''.$login_id.'\', \''.$random_value.'\', \''.time().'\', \''.$life.'\');'; # образуем в таблице coocie нашу строку с авторизацией
  16.                         mysql_query($zapros);
  17.                         setcookie('session_coocie', $random_value, time()+$life, '/'); # c этой же авторизацией создаём куку у пользователя
  18.                         $autorization = true;
  19.                         }
  20.         }else{
  21.                 $main = 'Неверный логин или пароль';
  22.                 $autorization = false;
  23.         }
  24. }elseif(isset($_COOKIE['session_coocie'])){ # если пост данных не поступило значит проверяем есть ли у пользователя куки-данные
  25.         $zapros = 'SELECT login, date, life FROM `coocie` WHERE name=\''.$_COOKIE['session_coocie'].'\';'; # если они есть сравниваем их с данными в нашей бд
  26.         $zapros = mysql_query($zapros);
  27.         if(mysql_num_rows($zapros)>0){ # проверяем вернул ли нам запрос что-нибудь
  28.                 while($row=mysql_fetch_array($zapros)){ # если вернул разбираем запрос
  29.                         $login_id = $row['login'];
  30.                         $date = $row['date'];
  31.                         $life = $row['life'];
  32.                 }
  33.                 if(($date)<(time()+$life)){ # проверяем не устарела ли кука
  34.                         $zapros = 'SELECT sess FROM `users` WHERE id =\''.$login_id.'\';'; # запрос в таблицу users получающий данные о настройках сессии
  35.                         $zapros = mysql_query($zapros);
  36.                         if(mysql_num_rows($zapros)>0){ # проверяем выдал ли нам что нибудь запрос
  37.                                 while($row = mysql_fetch_array($zapros)){
  38.                                         $sess = $row['sess']; # извлекаем настройки пользователя
  39.                                 }
  40.                         }
  41.                         if($sess){ # проверяем включен ли параметр
  42.                                 $random_value = md5(uniqid(rand(),1)); # создаем новую рандомную переменную
  43.                                 $life = 60; # определяем для неё жизнь
  44.                                 $zap = 'UPDATE `EXAMPLE`.`coocie` SET `name` = \''.$random_value.'\', `date` = \''.time().'\', `life` = \''.$life.'\' WHERE `coocie`.`login` =\''.$login_id.'\';'; # Запрос на обновление данных о сессии
  45.                                 mysql_query($zap);
  46.                                 setcookie('session_coocie', $random_value, time()+$life, '/'); # обновление куки
  47.                         }
  48.                 $autorization = true;                  
  49.                 }
  50.         }else{ # если время жизни истекло раньше
  51.                 $autorization = false;
  52.                 $main = 'Пожалуйста авторизируйтесь снова!';
  53.         }
  54. }else{ # если не было найдено не пост не куки данных
  55.         $autorization = false;
  56. }
  57. ?>
  58.  


ЗЫ: расписал всё как мог подробно, строго не судите первая моя статья)
ЗЗЫ: делал пример из своего кода, максимально пытался сократить и оставить только самое главное
(Добавление)
И конечно забыл добавить т.к. кука меняется каждый раз при просмотре страниц сайта один из пользователей под одним аком будет вылетать
2. EuGen - 02 Июля, 2012 - 18:48:39 - перейти к сообщению
Код никак не решает проблемы, подробно обсужденной здесь http://forum.php.su/topic.php?fo...1&topic=6008 (да, впрочем, её не сможет решить никакой код) - потому смысла большого в таком построении не вижу.
3. Prizma - 02 Июля, 2012 - 18:59:30 - перейти к сообщению
ты не прав... при авторизации с другого места кука изменится тоесть при переходе с первоначальной авторизацией авторизация слетит... не понял почему ты сказал что код проблемы не решает... так же появилась идея что можно изменить немного концепцию что бы каждый раз не менять куку можно менять куку только при авторизации (хотя это понизит уровень безопасности) тогда при получение пост данных куки данные изменятся и тот кто авторизировался раньше вылетит...

аргументируй почему это невозможно и код не работает... если ты имеешь ввиду то что как кто то зашел на сайт под твоим аком другому пользователю без переходов тут же вылетел eror это не так... но при переходе на другую страницу пользователь вернётся к авторизации если сраница заблокирована для гостей (ну или на главную от настроек сайта зависит)
(Добавление)
Тип авторизации: куки

я не использую сессии... та тема на которую ты меня отправил рассматривает именно сессии... мне сессии не нравятся я пользуюсь куками как переменными сообщаемыми в браузер пользователя и только.
4. Мелкий - 02 Июля, 2012 - 19:02:09 - перейти к сообщению
Да здравствуют SQL-инъекции! Если вы думаете, что их нет - ищите лучше. Огромная эксплуатируемая дыра и в таком ответственном коде.

Да здравствуют нотайсы. Включите вывод ошибок.
5. Prizma - 02 Июля, 2012 - 19:08:59 - перейти к сообщению
Мелкий пишет:
Да здравствуют SQL-инъекции! Если вы думаете, что их нет - ищите лучше. Огромная эксплуатируемая дыра и в таком ответственном коде.

Да здравствуют нотайсы. Включите вывод ошибок.
код для показания как использовать, по сути вот эта часть основная...
PHP:
скопировать код в буфер обмена
  1. if($sess){ # проверяем включен ли параметр
  2.                                $random_value = md5(uniqid(rand(),1)); # создаем новую рандомную переменную
  3.                                $life = 60; # определяем для неё жизнь
  4.                                $zap = 'UPDATE `EXAMPLE`.`coocie` SET `name` = \''.$random_value.'\', `date` = \''.time().'\', `life` = \''.$life.'\' WHERE `coocie`.`login` =\''.$login_id.'\';'; # Запрос на обновление данных о сессии
  5.                                mysql_query($zap);
  6.                                 setcookie('session_coocie', $random_value, time()+$life, '/'); # обновление куки
  7.                        }
в этом куске есть ошибки?

код я могу переписать если смысл имеет, я прост не уверен что эта статья будет кого то интересовать Улыбка я написал в общих чертах принцип
6. Мелкий - 02 Июля, 2012 - 19:21:08 - перейти к сообщению
Показывать надо хотя бы корректный пример. Защита с огромной дырой - защитой называться не может.

Prizma пишет:
в этом куске есть ошибки?

Кроме неинициализированной переменной - могло бы иметь место на жизнь, если бы не остальной код. А так - именно здесь вы открываете настежь дверь для всех.
7. Prizma - 02 Июля, 2012 - 19:26:06 - перейти к сообщению
Мелкий пишет:

Кроме неинициализированной переменной - могло бы иметь место на жизнь, если бы не остальной код. А так - именно здесь вы открываете настежь дверь для всех.
стоп стоп стоп где неинициализированная переменная? $sess:
PHP:
скопировать код в буфер обмена
  1. $zapros = 'SELECT id, sess FROM `users` WHERE login =\''.$_POST['login'].'\' and password=\''.$_POST['password'].'\';'; # запрос в таблицу users на соответствие логина и пароля
  2.                $zapros = mysql_query($zapros);
  3.                 if(mysql_num_rows($zapros)>0){ # проверяем выдал ли нам что нибудь запрос
  4.                        while($row = mysql_fetch_array($zapros)){
  5.                                 $login_id = $row['id']; # извлекаем id из предыдущего запроса
  6.                                $sess = $row['sess']; # извлекаем настройки пользователя
  7.                        }

ЗЫ: я обсолютно поддерживаю критику, но пожалуйста больше конкретики, я не против доработать код если он имеет смысл... Мне ж самому интересно найти минусы кода и варианты его возможного усовершенствования как относительно скорости работы так и защиты
8. EuGen - 02 Июля, 2012 - 19:32:02 - перейти к сообщению
Prizma
Какая разница - куки или сессии? Авторизация все равно основывается на данных, присланных клиентом. Перечитайте, пожалуйста, суть проблемы, описанной в той теме.
9. Мелкий - 02 Июля, 2012 - 19:33:33 - перейти к сообщению
Prizma пишет:
стоп стоп стоп где неинициализированная переменная? $sess:

Уууу, батенька. Т.е. вас совершенно не смущает, что определение и использование переменной находятся во взаимоисключающих блоках условия?
10. armancho7777777 - 02 Июля, 2012 - 19:37:46 - перейти к сообщению
Prizma пишет:
где неинициализированная переменная?

Prizma пишет:
PHP:
скопировать код в буфер обмена
  1. ... WHERE login =\''.$_POST['login'].'\' and password=\''.$_POST['password'].'\';' ...
... просто ужас.
11. Prizma - 02 Июля, 2012 - 19:45:47 - перейти к сообщению
Мелкий пишет:

Уууу, батенька. Т.е. вас совершенно не смущает, что определение и использование переменной находятся во взаимоисключающих блоках условия?
согласен) напортачил) в моём изначальном коде был ещё один блок я из него часть запихнул в else счас поправлю)
armancho7777777 пишет:
... просто ужас.
тебе кавычки не нравятся? прости привык использовать одинарные и символ экранизации... нечего не поделаешь (слышал что одинарыные работают быстрее двойных т.к. не идёт проверка на наличие переменных так и приучился использовать одинарные) или ужас в чем то другом?
(Добавление)
поправил код... в первом посте
Мелкий пишет:
Уууу, батенька.
какое там) просто пхп нравится появилась идея вот не поленился "озвучить", критику послушать
(Добавление)
Напомню что я конкретно этот код не тестил, я его получил упрощением своего кода, в моём коде немного другая концепция с доступом, поэтому эта переменная и вылезла...
всёравно не понял вот этого:
EuGen пишет:
Код никак не решает проблемы
EuGen пишет:
(да, впрочем, её не сможет решить никакой код)

(Добавление)
В моём рабочем примере происходит вот что(проверено могу залить на хост продемонстрировать):
1. Авторизируешься
2. Обновляешь страницу (без отправки пост данных) меняется кука и идентификатор в базе данных
3. заходишь с другого браузера авторизируешься
4. обновляешь страничку в первом браузере авторизация слетает т.к. кука изменилась и записалась уже в другом браузере

И что тут не возможного??????
12. armancho7777777 - 02 Июля, 2012 - 19:58:49 - перейти к сообщению
Prizma пишет:
тебе кавычки не нравятся?

Вы заметили только ковычки?)
Как Вы понимаете инициализацию переменных интересно)
P.S. И не надо тыкать....
13. Prizma - 02 Июля, 2012 - 20:00:05 - перейти к сообщению
armancho7777777 пишет:
Вы заметили только ковычки?)
Как Вы понимаете инициализацию переменных интересно)
P.S. И не надо тыкать....
предпологается что они поступают в данный мною скрипт из формы разве это не очевидно?
14. armancho7777777 - 02 Июля, 2012 - 20:00:31 - перейти к сообщению
Вы даже с EuGen-ом умидрились начать спорить ))
Нет слов))
15. Мелкий - 02 Июля, 2012 - 20:00:45 - перейти к сообщению
Prizma пишет:
согласен) напортачил) в моём изначальном коде был ещё один блок я из него часть запихнул в else счас поправлю)

А теперь подумайте ещё раз, что вы получили Подмигивание
Копипаст - худший помощник разработчика.

И всё равно - где хоть какое-то экранирование данных? Почему, когда вы используете значения только одной строки, используете цикл? Уберите уже нотайсы из самого первого условия.

 

Powered by ExBB FM 1.0 RC1