БлогNot. PHP: авторизация с помощью cookies, простой пример

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 просмотра]


теги: учебное php безопасность

показать комментарии (4)