PHP: авторизация с помощью cookies, простой пример
Если не принимать в расчёт не всегда удобную проверку того, включены ли у пользователя cookie-файлы, использовать их легко. К тому же, cookie позволяют управлять временем, в течение которого действует авторизация.
Ниже показан небольшой листинг, реализующий авторизацию пользователя с помощью "куки", хранящей зашифрованную алгоритмом md5 контрольную сумму от пароля. Имя кукиза auth
отличается от имени встроенной переменной, "ответственной" за пароль ($trypass
), так безопасней.
Вместо формы для ввода пароля он передаётся ссылкой через метод $_GET
, разумеется, в жизни так делать не нужно.
Также показана "альтернативная" моей обычной обработка параметров функцией get_param
. Обратите внимание, что глобальный массив $_REQUEST
содержит как данные массивов $_GET
и $_POST
, так и все $_COOKIE
, что позволяет получить компактный код обработки числовых и строковых параметров скрипта.
Предполагается, что файл выполняется на хосте под именем cookie.php
, вот полный листинг:
<?php $pass = md5('123'); //пароль для доступа function get_param ($name,$number=0) { //имя параметра $name и пометка $number, числовой ли он if (isset($_REQUEST[$name])) { //Массив $_REQUEST = $_POST+$_GET+$_COOKIE ! $name = trim(htmlspecialchars($_REQUEST[$name])); //делать для всех типов параметров //дальше числа и строки обрабатываем по-разному return ($number ? doubleval($name) : @mysql_real_escape_string($name)); } else return ($number ? 0 : ""); } if (!empty($_COOKIE['auth'])) $trypass = $_COOKIE['auth']; //есть сохранённый куки? прочитать else $trypass = md5(get_param('trypass')); //иначе попытаться получить пароль от юзера $go = get_param('go'); //некий параметр, обозначающий "действие" скрипта $access = false; //флажок "доступ к авторизованной части" if ($trypass==$pass) { //получен верный пароль $access = true; setcookie('auth',$pass,time()+3600); //ставим кукиз на час //в файле cookie хранится только зашифрованный пароль } if ($go=='logout') { //выбрано действие "выход" setcookie('auth','',time()-3600); //сбрасываем время действия кукиза $access = false; } if ($access) { //находимся в авторизованном режиме setcookie('auth',$pass,time()+3600); //продляем кукиз на час от текущего момента //здесь выбор других действий в зависимости от значения $go echo '<p>Контент для авторизованного пользователя; <a href="cookie.php">обновить</a>; <a href="cookie.php?go=logout">выход</a></p>'; } else { echo '<p>Вы не авторизованы; <a href="cookie.php">обновить</a>; <a href="cookie.php?trypass=123">автовход</a></p>'; //на самом деле пароль будет получен из формы } ?>
P.S. Функция mysql_real_escape_string устарела в PHP7. Если не хочется тащить в скрипт идентификатор соединения с БД, как требует MySQLi, попробуйте альтернативные решения, например, отсюда или просто замените @mysql_real_escape_string($name)
на $name
.
Вот более новая версия примера для PHP 7-8, поддерживает любое имя файла, не требует mysql_real_escape_string
:
<?php $pass = md5('123'); //пароль для доступа function get_param ($name,$number=0) { //имя параметра $name и пометка $number, числовой ли он if (isset($_REQUEST[$name])) { //Массив $_REQUEST = $_POST+$_GET+$_COOKIE ! $name = trim(htmlspecialchars(addslashes($_REQUEST[$name]),ENT_QUOTES,'UTF-8')); //дальше числа и строки обрабатываем по-разному return ($number ? doubleval($name) : $name); } else return ($number ? 0 : ""); } if (!empty($_COOKIE['auth'])) $trypass = $_COOKIE['auth']; //есть сохранённый куки? прочитать else $trypass = md5(get_param('trypass')); //иначе попытаться получить пароль от юзера $go = get_param('go'); //некий параметр, обозначающий "действие" скрипта $access = false; //флажок "доступ к авторизованной части" if ($trypass==$pass) { //получен верный пароль $access = true; setcookie('auth',$pass,time()+3600); //ставим кукиз на час //в файле cookie хранится только зашифрованный пароль } if ($go=='logout') { //выбрано действие "выход" setcookie('auth','',time()-3600); //сбрасываем время действия кукиза $access = false; } if ($access) { //находимся в авторизованном режиме setcookie('auth',$pass,time()+3600); //продляем кукиз на час от текущего момента //здесь выбор других действий в зависимости от значения $go echo '<p>Контент для авторизованного пользователя; <a href="'.$_SERVER['PHP_SELF'].'">обновить</a>; <a href="'.$_SERVER['PHP_SELF'].'?go=logout">выход</a></p>'; } else { echo '<p>Вы не авторизованы; <a href="'.$_SERVER['PHP_SELF'].'">обновить</a>; <a href="'.$_SERVER['PHP_SELF'].'?trypass=123">автовход</a></p>'; //на самом деле пароль будет получен из формы } ?>
22.02.2017, 10:21 [18742 просмотра]