Авторизация на php

PHP – скрипт, системы авторизации пользователей на сайте: сессии, безопасность.
Сейчас рассмотрим принцип, по которому можно осуществить авторизацию пользователей на сайте, с помощью php.

Допустим у нас должна быть форма авторизации и страница, к которой может получить доступ только тот, кто знает правильный логин и пароль. Это можно сделать абсолютно элементарно:
с помощью get-запроса с формы передаем пару логин-пароль к примеру: ?login=admin&pass=qwerty а далее, на странице, которая требует авторизацию, пишем нечто вроде:

1
2
3
4
5
6
<?php
if ( ($_GET['login'] != 'admin') || ($_GET['pass'] != 'qwerty') )
    die('У вас нет доступа к этой странице');
?>

А это контент страницы, который будет доступен, только если будут введены правильные логин и пароль.

Все бы хорошо, мы можем теперь добавлять к ссылкам введенные логин и пароль (?login=admin&pass=qwerty) и наш секретный контент будет отображаться только если эта пара правильная. К страницам на которых нужна авторизация, лишь нужно добавить код приведенный выше.

Но имеется проблема:
Такой подход, является крайне небезопасным. Во-первых, ваш логин и пароль всегда на виду (get-запрос – обычная ссылка), и любой случайный проходимец, сможет его увидеть, а во-вторых эта ссылка может сохраниться в истории браузера, закэшироваться, передана в поле referrer при переходе по посторонней ссылке и даже хакер-любитель скорее всего знает пару десятков способов, как можно увести ваш логин и пароль проверяемый таким образом.

Решение:
Мы могли бы отправлять логин и пароль при помощи post-запроса. Знаете, именно так и следует делать абсолютно всегда, про крайней мере при передаче данных авторизации. Однако это создает новую проблему: каждый раз когда нужно будет попасть на страницу нужно будет вводить логин и пароль. А если этих страниц 2 и больше, то логин и пароль нужно будет вводить на каждой, причем каждый раз!

Нужно чтобы у пользователя, сохранялась авторизация, например до нажатия на кнопку «выход» или закрытия окна браузера. До этого момента он мог бы кликать по страничкам сколько захотел, без лишних авторизаций и телодвижений. На данное требование у php есть очень достойный и удобный ответ: сессии.

Что такое сессии?
Сессии – это способ идентификации пользователя на сайте. Сервер записывает у себя определенные сессионные данные о вас, например логин и авторизировались ли вы на сайте. Вам в свою очередь дается идентификатор, по которому он определяет, что вы это вы, и эти данные относятся к вам.

Этот идентификатор, как правило, сохраняется в файлах cookies (иногда хранится в адресной строке), и передается на сайт каждый раз, когда вы загружаете какую-либо страницу. Эта страница, по идентификатору, находит ваши данные и смотрит авторизированы ли вы на сайте, и если да, то предоставляет доступ к скрытым данным.

Идентификатор действителен, только пока сессия не завершена.

Да, идентификатор сессии тоже могут украсть злоумышленники, но для этого им, как правило, нужен непосредственный доступ к компьютеру или установка на него шпионского ПО.
Кроме того идентификатор сессии, теряет свои «волшебные» свойства как только сессия истекает. Он становится просто никчемным набором символов – не более.
Так что, потеря этого идентификатора возможна из-за ошибок разработчика, а соответственно менее вероятна (конечно смотря какой разработчик) и способна привести к менее катастрофическим последствиям, хотя и крайне нежелательна.

Пожалуй хватит теории, она мало чему может научить. Напишем пример, авторизации пользователей.
Пример будет состоять из 2-х страничек требующих авторизацию и формы авторизации.

Содержимое файла index.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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
/*
 * лучше всегда стараться как-то отделить html от кода скрипта:
 * выносить в отдельный файл или хотя-бы в отдельную фунцию
 */


function draw_form($bad_login = false) {
    ?>
    <form action="" method="post">
        <input type="text" name="login"></input><br/>
        <input type="password" name="pass"></input>
        <input type="submit" name="submit"></input>
    </form>
    <?php
    if ($bad_login)
        echo 'неправильный логин и/или пароль';
}

/* Проверку логина и пароля, я вынес в отдельную функцию
 * это будет очень полезно, если в будущем мы решим хранить
 * данные пользователей например в базе данных.
 * Тогда придется изменить только эту функцию и ничего больше.
 */


function check_login($login, $pass) {
    return ($_POST['login'] == 'admin') && ($_POST['pass'] == 'qwerty');
}

// >>> точка входа <<<
session_start();

if (isset($_GET['logout'])) {
    session_unset();
    session_destroy();
    header("Location: index.php");
    exit(); // после передачи редиректа всегда нужен exit или die
    // иначе выполнение скрипта продолжится.
}

// на случай если мы уже авторизированы
if (!isset($_SESSION['login'])) {

    $login = $_POST['login'];
    $pass = $_POST['pass'];

    if (count($_POST) <= 0)
        draw_form();
    else {
        if (check_login($login, $pass))
            $_SESSION['login'] = $login;
        else
            draw_form(true);
            // параметр true передается чтобы показать, что был введен
            // неправильный пароль
    }
}

isset($_SESSION['login']) or die(); // здесь если функция вернула false то выполняется die()

echo 'Здравствуйте, ' . $_SESSION['login'];

// вот и все. теперь чтобы понять авторизирован ли пользователь
// достаточно проверить, содержится ли в переменной $_SESSION['login']
// его ник. А точнее объявлена она или нет. Это можно сделать при помощи isset()
?>
<br/>
это секретный контент
<br/>
<a href="page.php">другая страница</a><br/>
<a href="index.php?logout">выход</a>

Это содержимое файла page.php

1
2
3
4
5
6
7
8
9
10
11
12
session_start();

isset($_SESSION['login']) or die('вы не вошли');

echo 'Здравствуйте, ' . $_SESSION['login'];
?>
<br/>
это секретный контент 2
<br/>

<a href="index.php">на главную</a><br/>
<a href="index.php?logout">выход</a>

Так выглядит элементарная авторизация на сессиях. Всегда перед любыми манипуляциями с сессиями и их переменными, включая их чтение, нужно вставлять функцию session_start();

Переменные записанные в суперглобальный массив $_SESSION[] доступны из любой функции (сказано же, суперглобальный). Более того, эти переменные передаются между разными страницами, но везде перед их использованием должно быть написано session_start()

Если мы хотим разрегистрировать все переменные сессии, то следует написать session_unset(). Если это нужно сделать с одной единственной переменной, то можно написать unset($_SESSION['variable']).
Если следует уничтожить всю сессию и все что с ней связано, то для этого есть функция session_destroy()

Если вы хотите узнать про авторизацию более подробно, то рекомендую посмотреть подборку ссылок, по теме авторизации.

Отзывов (3).

  1. Роман пишет 03.09.11 в 1:41 пп

    Спасибо, все отлично работает!!!

  2. rekjger пишет 03.09.11 в 1:41 пп

     function GEt($date){
    echo "авоповалпвап";
    }
  3. AMD пишет 03.09.11 в 1:41 пп

    Подскажите как добавить в функцию check_login () проверку логина и пароля в БД

Ваш отзыв

Внимание! Если Вы хотите написать какой-либо код, то используйте тэги: [php] [/php] чтобы он не исковеркался.