Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование сессий в PHP

Алексей Сафонов
safikus[собака]gmail.com
22 июля 2006 года

Очень часто при написании скриптов на php необходимо хранить некоторую информацию о посетителе в течение всего сеанса его работы. Типичным примером такой ситуации является необходимость "помнить" логин и пароль пользователя при его нахождении в закрытой части сайта (например, на форуме). Собственного говоря, именно для этого и существует механизм сессий, реализованный в php, однако давайте все по порядку.

Для того, чтобы в скрипте можно было работать с сессиями, необходимо сначала инициализировать механизм сессий. Делается это с помощью функции session_start(). При этом будет создана новая сессия или восстановлена уже существующая. Как сервер узнает что ему делать: создавать или восстанавливать? Очень просто. Дело в том, что когда посетитель заходит на сайт, ему присваивается 32-х разрядный идентификатор вида: abcd1efgh2ijkl3mnop4qrs5tuv6wxyz, который "следует" за ним при всех перемещениях по сайту. "Следование" обеспечивается либо по средствам cookies, либо, если они отключены у пользователя, добавлением ко всем адресам GET-запроса вида: PHPSESSID=идентификатор, т.е. адрес myscript.php превратиться в myscript.php?PHPSESSID=идентификатор. При обработке запроса на сервере движок php ищет идентификатор в переданных ему данных и, если находит и сессия не устарела, то обновляет ее. В противном случае создается новая. Кстати, идентификатор сессии можно получить с помощью функции session_id();

После того, как механизм сессий был инициализирован в скрипте мы можем сохранять любую информацию в ассоциативном массиве $_SESSION. Этот массив является глобальной переменной сессии. Таким образом, сохранив в нем, к примеру, значения переменных login и password на странице авторизации мы можем использовать их на всех остальных страницах защищенной части сайта.

Завершение сессии происходит либо автоматически по истечению определенного промежутка времени, либо принудительно при использовании функции session_destroy().

Ну вот, с теорией мы разобрались, теперь настало время применить ее на практике. Для этого напишем 3 скрипта: login.php - авторизация посетителей, protected.php - закрытая страница и logout.php - завершение работы.

login.php

Код:
<?
session_start(); //инициализирум механизм сесссий

if(!isset($_POST['ok'])) {
// если форма не заполнена, то выводим ее
    echo"
    <html>
    <head>
    <title>Страница авторизации</title>
    </head>
    <body>
    <table width='100%' height='100%'>
    <form method='POST' action='login.php'>
    <tr><td align=center>
    <table>
    <tr><td>
    <table>
    <tr><td>Login:</td><td><input type='text'
        name='login' size='15'></td></tr>
    <tr><td>Password:</td><td><input
        type='password' name='pass' size='15'></td></tr>
    </table>
    </td></tr>
    <tr><td align=center><input type='submit' name='ok'
        value='Вход'></td></tr>
    </table>
    </td></tr>
    </form>
    </table>
    </body>
    </html>
    "
;
}
else{  
    //предполагается, что информацию о пользователях вы
    //храните в базе данных, в таблице users, содержащей поля id, login, pass

    $db=mysql_connect('host', 'login', 'password');
    mysql_select_db('db_name', $db);
   
    //проверяем есть ли пользователь с таким login'ом и password'ом
    $res=mysql_query("SELECT * FROM users WHERE login='".$_POST['login']."'
        AND pass='"
.$_POST['pass']."'", $db);
    if(mysql_num_rows($res)!=1){    //такого пользователя нет
        echo "Введены не верные логин или пароль";
    }
    else{   //пользователь найден
        $_SESSION['login']=$_POST['login']; //устанавливаем login & pass
        $_SESSION['pass']=$_POST['pass'];
        Header("Location: protected.php");  // еренаправляем на protected.php
    }
   
    mysql_close();
}

protected.php
<?
session_start(); //инициализирум механизм сесссий

//начинаем проверку логина и пароля

$db=mysql_connect('host', 'login', 'password');
mysql_select_db('db_name', $db);
$res=mysql_query("SELECT * FROM users WHERE login='".$_SESSION['login']."'
    AND pass='"
.$_SESSION['pass']."'", $db);
if(mysql_num_rows($res)!=1){    //такого пользователя нет
    Header("Location: login.php");  //перенаправляем на login.php  
}
else{   //пользователь найден, можем выводить все что нам надо
    echo "Текст закрытой страницы<br><a href='logout.php'>Выход</a>";
}
mysql_close();
?>

logout.php

Код:
<?
session_start();    //инициализируем механизм сессий
session_destroy();  //удаляем текущую сессию
Header("Location: protected.php");  //перенаправляем на protected.php
?>

Ну вот, и все. Надеюсь, эта статья кому-нибудь поможет.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
86K
26 октября 2012 года
Robin Keen
0 / / 26.10.2012
+2 / -1
Мне нравитсяМне не нравится
26 октября 2012, 12:22:02
В листинге login.php не хватает кавычки ' перед login в $db=mysql_connect('host', login', 'password');
и не хватает в конце закрывающего тега ?>
:)
2.
68K
19 января 2011 года
witaros
0 / / 19.01.2011
+0 / -1
Мне нравитсяМне не нравится
19 января 2011, 12:47:54
Я абсолютно согласен с большинством, относительно данной статьи!!!
Но:
1. Что бы написать такое "or name in('administrator','adm','root')" надо сначала знать, что поле таблицы имеет название "name", а не "fio","nik" или тому подобное. Видел много таких статей (из области фантастики).
2. Проверка здесь идёт по имени и по пользователю так, что вариант типа "or name in('administrator','adm','root')" уже не катит. Только облегчает подбор пароля!
3. Не забывайте пользоватся чудесными функциями экранирования скобок!!!
3.
67K
22 декабря 2010 года
renatik
0 / / 22.12.2010
+1 / -2
Мне нравитсяМне не нравится
22 декабря 2010, 00:58:39
вообще не понимаю зачем хранить логин и пароль в сессии
не проще проверять логин и пароль и если они верны иницировать сессию
session_start();
$_SESSION['id'] = session_id();
а на всех остальных страничках просто
session_start();
if(!isset($_SESSION['id']))
{
exit;
}
4.
65K
04 ноября 2010 года
lamasoska
0 / / 04.11.2010
+9 / -2
Мне нравитсяМне не нравится
4 ноября 2010, 13:53:25
*пускает слюну, глядя на код* :) Люблю, когда перменную из гета или поста сразу запрос вставляют )


$res=mysql_query("SELECT * FROM users WHERE login='".$_POST['login']."'
AND pass='".$_POST['pass']."'", $db);
if(mysql_num_rows($res)!=1){ //такого пользователя нет
echo "Введены не верные логин или пароль";


достаточно заполнить лишь поле с именем пользователя и получаем что-нибудь наподобие:
$_POST['name'], содержащую строку "admin' or name in('administrator','adm','root') LIMIT 1 --"

и вместо, к примеру
$res=mysql_query("SELECT * FROM user WHERE name='admin'
AND pass='неверный пароль'", $db);
if (mysql_num_rows($res)==0) die("Юзер то не создан!");

получаем самый безобидный вариант развития событий :)
$res=mysql_query("SELECT * FROM user WHERE name='admin' or name in('administrator','adm','root') LIMIT 1 --", $db);

что еще для счастья надо )
адреса сайтов с подобной авторизацией в студию пожалуйста :))) посмотрю, из чего они сделаны, может автограф оставлю где ;)

вы хоть обработку данных делайте :)
$username=myvarcheck ($_POST['name']);
$pass=myvarcheck($_POST['pass']);

5.
61K
23 мая 2010 года
Maharaja
0 / / 23.05.2010
+7 / -1
Мне нравитсяМне не нравится
23 мая 2010, 15:42:05
Дааааа, походу WarWar и автор первого коментария здесь единственные, кто имеет правильное представление о сессиях PHP... Ребята чё за бред вы несёте? Для того что бы авторизировать пользователя достаточно один раз пробить пароль по базе, затем занести его логин либо ID в переменную сессии и в последующих входах в защищённую зону сайта использовать эту переменную как ключ к информации авторизированного пользователя... Никаких лишних переменных сессий создавать не надо, тем более пихать в сессию пароль и постоянно сверять его по базе при каждом посещении защищённой зоны сайт... Запомните, переменные сесси создаются PHP сценарием(их значение невозможно подделать за исключением внедрения вредоносного кода либо, что ещё не реальней, взлома сервера хостинг провайдера), переменный сессии хранятся на сервере, НЕ ПЕРЕДАЮСТЯ по http протоколу, единственное что можно отследить снифером анализируя сетевой трафик так это SID (иными словами сессионный идентификатор)... ВЫВОД...проблема безопасности сессий это парковка либо перехват SID...


6.
52K
23 июля 2009 года
Пользовател
0 / / 23.07.2009
+8 / -5
Мне нравитсяМне не нравится
23 июля 2009, 22:16:43
Аж зарегестрировался, чтоб прокоментировать.

Не вздумайте, выбросьте, что угодно сделайте, но не применяйте это у себя на сайте. Вот после таких статей и говорят, что пол интернета делали дебилы.
7.
42K
06 сентября 2008 года
generalG
0 / / 06.09.2008
+3 / -1
Мне нравитсяМне не нравится
7 сентября 2008, 08:57:40
Короче не видет пользователей в mysql. Почему? Может кто приведём более полную информацию о БД под эту ссесию?
8.
42K
06 сентября 2008 года
generalG
0 / / 06.09.2008
+2 / -2
Мне нравитсяМне не нравится
6 сентября 2008, 22:52:02
<php>$db=mysql_connect('localhost', 'root', '') or die("Не подконектиться к БД");
mysql_select_db('userbase', $db) or die("Не выбрать БД (не создана видимо)");

//проверяем есть ли пользователь с таким name'ом и password'ом
$res=mysql_query("SELECT * FROM user WHERE name='".$_POST['name']."'
AND pass='".$_POST['pass']."'", $db);
if (mysql_num_rows($res)==0) die("Юзер то не создан!");</php>
9.
42K
06 сентября 2008 года
generalG
0 / / 06.09.2008
+1 / -1
Мне нравитсяМне не нравится
6 сентября 2008, 22:48:58
А помогите создать БД для этой ссесии. Почему то по откладке пишет что юзверь не создан. Почему?
10.
39K
27 августа 2008 года
un4given
5 / / 27.08.2008
+3 / -2
Мне нравитсяМне не нравится
27 августа 2008, 07:17:57
=/ я лично в базе храню пароль с двойным md5 шифрованием
+ хэш и ip

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


минус в том, что некоторые кукисы отрубают...а в остальном доволньо надёжно
11.
41K
27 июня 2008 года
Winxp
0 / / 27.06.2008
+1 / -2
Мне нравитсяМне не нравится
27 июня 2008, 15:48:24
Очень легко может в сессии оказаться незарегестрированный пользователь,сессию можно подменить,особенно если большой онлайн на сайте тут ник подмены можно выбрать самый распространенный вот и все сломано,так что лучше на каждой странице защищенной части сайта сверять пароль и логин,пароль зашифровать в md5,если его и перехватят то голову сломают над расшифровкой,это тозе возможно сломать,но уже по сложнее чем предлогает WarWar
12.
20K
03 августа 2006 года
AZ4ZeL
2 / / 03.08.2006
+2 / -3
Мне нравитсяМне не нравится
3 августа 2006, 22:23:20
я обычно делаю следующим образом...


в базе данных храню двойной md5 хеш пароля. ( md5(md5($password)) )

а в сесии сохраняю и передаю одинарный хеш пароля.

а сохранять пароль в чистом виде, как в базе данных,
так и в сесии это крайность уязвимости..
13.
12K
29 июля 2005 года
WarWar
7 / / 29.07.2005
+2 / -2
Мне нравитсяМне не нравится
31 июля 2006, 16:24:52
да, немного усложним тему...
как быть с отдачей файла из базы данных по паролю, хранимому в сесии?
нам же прийдется передавать нестандартный заголовок, а сесии использующие куки тоже кое что пишут в заголовок?
эта тема нераскрыта в статье.
14.
12K
29 июля 2005 года
WarWar
7 / / 29.07.2005
+10 / -4
Мне нравитсяМне не нравится
31 июля 2006, 15:48:37
$_SESSION['pass']=$_POST['pass'];

нерекомендую хранить пароли в сессиях!

0.по возможности перешли на защищенное соединение.
1.спросили логин и пароль, сверили их и запомнили пользователя в сессии (БЕЗ ПАРОЛЯ), откуда ж у нас в сессиях возмется пользователь непрошедший регистрацию
1,5. если переходили на защищенное соединение, то уже можно переходить на обычное (ведь пароль мы больше не собираемся спрашивать).
2.работаем с защищенной версией сайта (ведь имя пользователя мы уже знаем и можем отличить от незарегистрированного).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог