3 Сен
Авторизация на 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()
Если вы хотите узнать про авторизацию более подробно, то рекомендую посмотреть подборку ссылок, по теме авторизации.

Роман пишет 03.09.11 в 1:41 пп
Спасибо, все отлично работает!!!
rekjger пишет 03.09.11 в 1:41 пп
function GEt($date){ echo "авоповалпвап"; }AMD пишет 03.09.11 в 1:41 пп
Подскажите как добавить в функцию check_login () проверку логина и пароля в БД