Warning: array_key_exists(): The second argument should be either an array or an object in /hsphere/local/home/magistr/codeismy.name/ads/sape.php on line 695 Warning: array_merge(): Argument #2 is not an array in /hsphere/local/home/magistr/codeismy.name/wp-content/plugins/wp-pagenavi/scb/Options.php on line 46

Работа с сессиями. Авторизация

Дата: Апрель 11, 2009

(5) комментариев

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 <?
    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 "Введены не верные логин или парол

protected.php

1
2
3
4
5
6
7
8
9
10
11
12
13
    <?
    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{ //пользователь найден, можем вывод

logout.php

1
2
3
4
    <?
    session_start(); //инициализируем механизм сессий
    session_destroy(); //удаляем текущую сессию
    Header("Location: protected

На этом простом примере авторизации мы показали работу сессий и простой пример авторизации по ним.

a

    Автор: Sergey




    5 комментариев на "Работа с сессиями. Авторизация"

    Олег сказал:
    25.07.2009

    Хорошо написано. Очень полезно и актуально для любого сайта.
    Попал на блог случайно, но не жалею потраченого времени.

    Олег сказал:
    26.07.2009

    Все хорошо, но зачем дублировать запрос к базе users в файле protected.php, если проверка login и password
    была в login.php

    magistr_bender сказал:
    26.07.2009

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

    Серж сказал:
    15.05.2010

    какое же времы по умолчанию хранится идентификатор сессии или ои бесконечно хранится?

    Gogita сказал:
    13.08.2010

    Zdravstvuite!
    Posle tega
    header(«Location:protected.php»);
    oshibka:
    Warning: Cannot modify header information — headers already sent by (output started at Z:\home\phpsaiti.ge\www\parts\db_connect.php:3) in Z:\home\phpsaiti.ge\www\admin\login.php on line 37.
    Mojet podskajite kak ego ispravit.

    Продолжение дискуссии на форуме: link


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов