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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Prizma
Отправлено: 02 Июля, 2012 - 18:17:40
Post Id



Посетитель


Покинул форум
Сообщений всего: 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) вот такой код:
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.  


ЗЫ: расписал всё как мог подробно, строго не судите первая моя статья)
ЗЗЫ: делал пример из своего кода, максимально пытался сократить и оставить только самое главное
(Добавление)
И конечно забыл добавить т.к. кука меняется каждый раз при просмотре страниц сайта один из пользователей под одним аком будет вылетать

(Отредактировано автором: 02 Июля, 2012 - 20:05:31)

 
My status
 Top
EuGen Администратор
Отправлено: 02 Июля, 2012 - 18:48:39
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Код никак не решает проблемы, подробно обсужденной здесь http://forum.php.su/topic.php?fo...1&topic=6008 (да, впрочем, её не сможет решить никакой код) - потому смысла большого в таком построении не вижу.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Prizma
Отправлено: 02 Июля, 2012 - 18:59:30
Post Id



Посетитель


Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012  
Откуда: Санкт-Петербург


Помог: 5 раз(а)




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

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

я не использую сессии... та тема на которую ты меня отправил рассматривает именно сессии... мне сессии не нравятся я пользуюсь куками как переменными сообщаемыми в браузер пользователя и только.
 
My status
 Top
Мелкий Супермодератор
Отправлено: 02 Июля, 2012 - 19:02:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Да здравствуют SQL-инъекции! Если вы думаете, что их нет - ищите лучше. Огромная эксплуатируемая дыра и в таком ответственном коде.

Да здравствуют нотайсы. Включите вывод ошибок.


-----
PostgreSQL DBA
 
 Top
Prizma
Отправлено: 02 Июля, 2012 - 19:08:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012  
Откуда: Санкт-Петербург


Помог: 5 раз(а)




Мелкий пишет:
Да здравствуют 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.                        }
в этом куске есть ошибки?

код я могу переписать если смысл имеет, я прост не уверен что эта статья будет кого то интересовать Улыбка я написал в общих чертах принцип
 
My status
 Top
Мелкий Супермодератор
Отправлено: 02 Июля, 2012 - 19:21:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Показывать надо хотя бы корректный пример. Защита с огромной дырой - защитой называться не может.

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

Кроме неинициализированной переменной - могло бы иметь место на жизнь, если бы не остальной код. А так - именно здесь вы открываете настежь дверь для всех.


-----
PostgreSQL DBA
 
 Top
Prizma
Отправлено: 02 Июля, 2012 - 19:26:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012  
Откуда: Санкт-Петербург


Помог: 5 раз(а)




Мелкий пишет:

Кроме неинициализированной переменной - могло бы иметь место на жизнь, если бы не остальной код. А так - именно здесь вы открываете настежь дверь для всех.
стоп стоп стоп где неинициализированная переменная? $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.                        }

ЗЫ: я обсолютно поддерживаю критику, но пожалуйста больше конкретики, я не против доработать код если он имеет смысл... Мне ж самому интересно найти минусы кода и варианты его возможного усовершенствования как относительно скорости работы так и защиты

(Отредактировано автором: 02 Июля, 2012 - 19:28:01)

 
My status
 Top
EuGen Администратор
Отправлено: 02 Июля, 2012 - 19:32:02
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Prizma
Какая разница - куки или сессии? Авторизация все равно основывается на данных, присланных клиентом. Перечитайте, пожалуйста, суть проблемы, описанной в той теме.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 02 Июля, 2012 - 19:33:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Prizma пишет:
стоп стоп стоп где неинициализированная переменная? $sess:

Уууу, батенька. Т.е. вас совершенно не смущает, что определение и использование переменной находятся во взаимоисключающих блоках условия?


-----
PostgreSQL DBA
 
 Top
armancho7777777 Супермодератор
Отправлено: 02 Июля, 2012 - 19:37:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Prizma пишет:
где неинициализированная переменная?

Prizma пишет:
PHP:
скопировать код в буфер обмена
  1. ... WHERE login =\''.$_POST['login'].'\' and password=\''.$_POST['password'].'\';' ...
... просто ужас.

(Отредактировано автором: 02 Июля, 2012 - 19:38:28)

 
 Top
Prizma
Отправлено: 02 Июля, 2012 - 19:45:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012  
Откуда: Санкт-Петербург


Помог: 5 раз(а)




Мелкий пишет:

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

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

И что тут не возможного??????

(Отредактировано автором: 02 Июля, 2012 - 19:59:11)

 
My status
 Top
armancho7777777 Супермодератор
Отправлено: 02 Июля, 2012 - 19:58:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Prizma пишет:
тебе кавычки не нравятся?

Вы заметили только ковычки?)
Как Вы понимаете инициализацию переменных интересно)
P.S. И не надо тыкать....
 
 Top
Prizma
Отправлено: 02 Июля, 2012 - 20:00:05
Post Id



Посетитель


Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012  
Откуда: Санкт-Петербург


Помог: 5 раз(а)




armancho7777777 пишет:
Вы заметили только ковычки?)
Как Вы понимаете инициализацию переменных интересно)
P.S. И не надо тыкать....
предпологается что они поступают в данный мною скрипт из формы разве это не очевидно?
 
My status
 Top
armancho7777777 Супермодератор
Отправлено: 02 Июля, 2012 - 20:00:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Вы даже с EuGen-ом умидрились начать спорить ))
Нет слов))
 
 Top
Мелкий Супермодератор
Отправлено: 02 Июля, 2012 - 20:00:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Prizma пишет:
согласен) напортачил) в моём изначальном коде был ещё один блок я из него часть запихнул в else счас поправлю)

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

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


-----
PostgreSQL DBA
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB