Примет простого php скрипта для авторизации (аутентификации) пользователей

18.04.2021

Начинающие программисты часто считают, что если нужна аутентификация, авторизация и/или разделение по правам (ACL Access Control List), то это очень сложно и нужно обязательно использовать CMS или framework.

Ниже приведу пример простого php скрипта для демонстрации, что это не так.

Скрипт работает через сессии и демонстрирует самые базовые проверки:

 
<?
  error_reporting(2047);
  ini_set('display_errors', '1');

  // Увеличиваем время жизни сессии, иначе выкидывает каждый час.
  ini_set('session.gc_maxlifetime', 172800);
  ini_set('session.cookie_lifetime', 172800);

  session_start();
  $bAuth = False;
  
  $sPass = 'secret';
  $sSalt = '6%4%!!8%Fg&g21';
  $sRightToken = md5($sPass . $sSalt);
  
  $sInSessionToken = isset($_SESSION['token'])?$_SESSION['token']:NULL;


  $sAction = 'По умолчанию';
  $sMessage = '';


  if (isset($_REQUEST['logoff'])) { // Выходим если пришел параметр logoff с формы
    $sAction = 'Выход';
    $_SESSION['token'] = '';
  } elseif (isset($_REQUEST['pass'])) { // Передан пароль с формы
    $sAction = 'Проверка пароля с формы ';
    $sInToken = md5($_REQUEST['pass'] . $sSalt);
    $bAuth = ( $sInToken == $sRightToken );
    if($bAuth) { // Если пароль верный, то сохраняем токен в сессию
      $_SESSION['token'] = $sInToken;
    } else {
      $sMessage = 'Введенный пароль неверен';
    }
  } elseif ($sInSessionToken) { // Проверяем токен, если он передан через сессию
    $sAction = 'Проверка токена из сессии';
    $bAuth = ( $sInSessionToken == $sRightToken );
    if(!$bAuth) {
      $sMessage = 'Неверный токен';
    }
  }

?>
<h2>Действие: <?=$sAction?></h2>
<h3><?=$sMessage?></h3>
<?

  if ($bAuth) {
?>
<form action="/" method="post">
    <h1>Вы авторизованы</h1>
    <input type="hidden" name="logoff" value="1" />
    <button>Выйти</button>
</form>
<?
  }
  else {
?>
<form action="/" method="post">
    <h1>Вы НЕ авторизованы</h1>
    <input type="text" name="pass" />
    <button>Войти</button>
</form>
<?
  }
?>


Яндекс.Метрика