Сторінка організації кодування авторизації на сайті

травень 2015

registration

Питання розділу

  1. Вступ, навіщо необхідна авторизація?
  2. Які основні блоки необхідні для авторизації користувача сайту?
  3. Застосування Cookies та SESSION?
  4. Створення таблиці "User"
  5. Хеш, Сіль та шифрування даних
  6. Як виконати перевірку даних при авторизації?
  7. Як виглядає скрипт авторизації?


1. Вступ, навіщо необхідна авторизація?

Якщо користувач веб-ресурсу вже зареєстрований на сайті і його Логін та Пароль є в Базі Даних веб-ресурсу, то ще які додаткові елементи необхідно реалізувати для подальшої зручності використання даного ресурсу?
- Звичайно веб-ресурс має розпізнавати цього користувача і скрипт має спростити вхід на сайт, більше того - обмін даними в плані збереження Логіну та Паролю повинен бути безпечним.

Відмічу, що суміжною темою авторизації учасника є реєстрація самого учасника, необхідне кодування реєстрації розглянемо окремо в навчальній статті "Реєстрація" .




2. Які основні блоки необхідні для авторизації користувача сайту?

authorization link

Необхідними елементами для реалізації авторизації користувача будуть:

Логічно було б припустити, щоб скрипт на стороні серверу розпізнав "свого" користувача необхідно провести перевірку на відповідність даних, на стороні клієнту та даних на стороні серверу.

Дані на стороні клієнту можуть зберігатись застосовуючи файли Сookie або варіант застосування механізму сесій $_SESSION. Але застосовуючи сесії дані все ж зберігаються на стороні серверу, а на стороні клієнту є лише ідентифікатор, що вказує, які дані належать цьому користувачу.

Детальніше про сесії варто почитати php.net/session та переглянути навчальний ресурс www.w3schools.com/php_sessions.



3.1. Дещо про Coockies

Файл Coockies зберігає дані на стороні клієнту.

HTTP-cookie, «реп'яшки» або«Куки» (англ. Cookie, множина англ. Cookies - тістечка, печиво) — в комп'ютерній термінології поняття, яке використовується для опису інформації у вигляді текстових або бінарних даних, отриманих від веб-сайту на веб-сервері, яка зберігається у клієнта, тобто браузера, а потім відправлена на той же сайт, якщо сайт повторно відвідати.

Детальніше на www.w3schools.com/php_cookies.

Файл створюється за допомогою функції setcookie(), синтаксис якої:

setcookie(name, value, expire, path, domain, secure, httponly);

де,
name - Ім'я змінної cookie,
value - Значення змінної cookie,
expire - Атрибут вказує час зберігання cookie,
path - Атрибут Path визначає підмножина URL, до яких застосовується cookie,
domain - вказує для якого домену діє змінної cookie,
secure - вказує спосіб передачі змінної cookie, безпечний (HTTPS) чи звичайний способом.

Простий приклад роботи скрипту, що створює файл Coockies та виводить значення даних...

<?php
$cookie_name = "user";
$cookie_value = "John Doe";

//встановлюємо змінну $cookie_name на місяць 86400(24*60*60) * 30
setcookie($cookie_name, $cookie_value,time()+(86400*30),"/"); 
?>

<html>
<body>
<?php
if(!isset($_COOKIE[$cookie_name])) {
    echo "Змінна Cookie '" . $cookie_name . "' не встановлена!";
} else {
    echo "Cookie '" . $cookie_name . "' встановлена!";
    echo "Значення: " . $_COOKIE[$cookie_name];
}
?>

</body>
</html>


3.2. Дещо про $_SESSION

За допомогою Сесії ($_SESSION) можна досить легко ідентифікувати користувача веб-сайту.

На відміну від Кукі (cookie), дані Сесії (наприклад, улюблений колір, ім'я та інше) зберігаються в тимчасових файлах на сервері. На стороні клієнта зберігається лише ідентифікатор Сесії, на зразок коду: "765487cf34ert8dede5a562e4f3a7e12". Якщо скажімо користувач змінив веб-сторінку сайту на іншу скрипт нової веб-сторінки просто перевіряє наявність коду, якщо код є -> то сервер таким чином ідентифікує користувача.

Для роботи з Сесіями необхідно на кожній сторінці, де будуть проводитись роботи, застосувати функцію session_start(), до виведення інформації на екран.

Для запису в Сесію існує масив $_SESSION.

Наприклад, перший файл Index.php виконає запис до Сесії:

<?php
session_start();
$_SESSION['test'] = "Будь-які дані.";
?>

Інший файл session.php прочитає дані Сесії:

<?php
session_start();

echo $_SESSION['test']; //Результат буде 'Будь-які дані.'
?>

Скільки живуть дані Сесії($_SESSION)?

Налаштування даних $_SESSION відбувається в php.ini. Зазвичай конфігураційний файл налаштований таким чином, щоб дані Сесії втрачали силу як тільки користувач закриває браузер.

info label

За ресурсом php.net: session.cookie_lifetime integer
session.cookie_lifetime specifies the lifetime of the cookie in seconds which is sent to the browser. The value 0 means "until the browser is closed." Defaults to 0.

Детальніше за офіційним ресурсом http://php.net/.../session-set-cookie-params.php



4. Щодо таблиці "User" Бази Даних

Для збереження на стороні серверу даних Логіна, Пароля, Хешу створимо таблицю "User"

Необхідні елементи Таблиця "Users" Бази Даних:
- id
- login_name
- password
- salt
- email

Створити таблицю можна декількома способами: застосовуючи PhpMyAdmin, програму роботи з базами даних heidisql.com, чи просто створивши її засобами php детальніше на php_mysql_create_table.asp


SQL-запит на створення таблиці:

CREATE TABLE User (
id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
login_name varchar(30) NOT NULL, 
password varchar(32) NOT NULL, 
salt varchar(32) NOT NULL,
email varchar(40) NOT NULL,
)

Створюючи таблицю "User" ми вводимо таке поле як "hash_password" та "salt".

- А що таке Хеш та Сіль в кодуванні? Далі...



5. Хеш, Сіль та шифрування даних

цифрові відбитки

Щодо шифрування даних,.. зазвичай паролі користувачів шифрують, щоб виключити можливість у випадку викрадення даних з БД мати список паролей користувачів. Застосовують різні алгоритми шифруванняя даних, так наприклад застосовують хешування даних та добавляється "сіль" до хешування.

- Що таке Хеш? Та навіщо він застосовується?

З Вікіпедії Хешування (іноді гешування, англ. hashing) — перетворення вхідного масиву даних довільної довжини у вихідний бітовий рядок фіксованої довжини. Такі перетворення також називаються хеш-функціями або функціями згортки, а їх результати називають хешем, хеш-кодом або дайджестом повідомлення (англ. message digest).

Хеші — це щось типу відбитків пальців для даних.

Кожний хеш точно відповідає певному файлу, або певній послідовності даних. Хоча б теоретично. На тому малюнку — 128-бітний MD5 хеш, він дає 2^128 унікальних значень, це 340 трилліонів трилліонів трилліонів. Реально простір значень дещо менший — коллізії почнуть з’являтися, якщо використати половину значень. Втім, половина неймовірно великого числа все ще залишається неймовірно великим числом.

MD5 (Message Digest 5) — 128-бітний алгоритм хешування, розроблений професором Рональдом Л. Рівестом в 1991 році. Призначений для створення «відбитків» або «дайджестів» повідомлень довільної довжини.

Хеш-функція або Геш-функція — функція, що перетворює вхідні дані будь-якого (як правило, великого) розміру в дані фіксованого розміру.

Детальніше про створення хешу застосовуючи php хеш-функцію можна переглянути на офіційному php.net .

Демонстрація роботи хешування даних

Введіть довільний набір символів, та перевірте його шифроване значення:

Реалізація шифрування досить проста:

$password = md5($password);

Надійність шифрування даних

Варто відзначити, щоб ускладнити роботу зловмисникам, хоча ні,.... щоб збільшити безпеку зберігання даних варто не лише хешувати пароль, а також добавити "сіль" до хешованих даних.

В криптографії Сіль (модифікатор) - це рядок випадкових символів, що додається на вхід хеш-функції, використовується для збільшення стрічки хешу паролю, таким чином ускладнюючи підбір паролю. - Нічого не зрозуміло :)

детальніше:

$password = 'password';        // Пароль
$hash1 = md5($password);       // Хеш Пароля
$salt = 'sflprt49fhi2';        // Гереруємо рядок довільних символів
$hash2 = md5($hash1 . $salt);  // Хеш Паролю та солі функцією md5()

Суть солі, якщо в таблиці зберігається хеш паролю, щось на зразок "b33aed8f3134996703dc39f9a7c95783", то зловмистник все ж швидко (день) чи повільно (рік), але зможе підібрати пароль. Але якщо в нас лежить не просто хеш паролю, а хеш комбінації паролю та випадкового набору символів, або навіть свій алгоритм комбінації паролю+солі, - то підбір паролю стає в рази складнішим.

Варто відмітити, що реалізовані спеціальні функції хешування та створення солі засобами php crypt('password') .



6. Об'єднання елементів авторизації. Зовсім простий варіант.

Попробуємо виконати авторизацію відвідувача із застосуванням Coockies-файлу.

1. Якщо зареєстрований користувач заходить вперше, зрозуміло що його ми зможемо авторизувати лише через Логін та Пароль.

2. Якщо Логін/Пароль введений вірно, створимо секретний ключ в Coockies-файлу, щоб нас можна було пропускати як "свого" наступного разу.

2.1. Якщо Логін/Пароль введений з помилкою, -> знову повертаємось до форми веедення Логіну/Паролю.

3. Якщо відвідувач заходить на веб-сайт вдруге, перевіряємо на наявність секретного ключа; якщо він є,- перевіряємо його в базі даних чи він правильний.



7. Скрипт Демо сторінки авторизації.

Скрипт реєстрації на сайті:

<?php
$conn = new mysqli("host","User","Pass","DB");
$conn->set_charset("utf8");
$result = $conn->query("SELECT * FROM Users");
$max_row = $conn->affected_rows;
$conn->close();

// Random function 
function generateCode($length=6) {
    $chars = "abcdefghijklmnopqrstuvwxyzABC";
    $code = "";
    $clen = strlen($chars) - 1;  
    while (strlen($code) < $length) {
            $code .= $chars[mt_rand(0,$clen)];  
    }
    return $code;
};


$code='web_code';

//змінна повної авторизації
$access=false;

//змінна доступу до форми Входу
$access_form=true;

//змінна успішного входу в систему
$access_sucsess=false;

//змінна помилкового входу в систему
$wrong_access_form=false;

// перевіряємо наявність коду в файлові $_COOKIE
if(isset($_COOKIE[$code])) {    
    $access=true;
};

if ($access===false){
  // перевіряємо логін пароль
  if (isset($_POST['submit'])) {
      $login_value = $_POST["login"];
      $password_value = $_POST["password"]; 
    
      while ($row = $result->fetch_assoc()){
          if ( ($login_value===$row['login_name']) and 
               ($password_value===$row['password']) ){ 
                          
             //якщо є відповідність закінчуємо перевірку         
             $result->data_seek($max_row-1);           
             // є відповідність - даємо доступ
             $access_sucsess=true;
             $code_value=generateCode(10);
             setcookie($code, $code_value,time()+(86400*7),"/");
          };
          // перевірка на помилковий доступ
          if (!$access_sucsess){
            $wrong_access_form=true;
          };         
     };
     $result->data_seek(0);
  };
};

// є COOKIE
if ($access===true){  
  $access_form=false;
  echo'<style>
  .step_01 {display: none;}
  .step_02 {display: none;}
  .step_03 {display: none;}
  .step_04 {display: block;}
   </style>';    
};

// показати форму входу
if ($access_form===true){
  echo'<style>
  .step_01 {display: block;}
  .step_02 {display: none;}
  .step_03 {display: none;} 
  .step_04 {display: none;}
  </style>';
};

// успішний вхід
if ($access_sucsess===true){
  echo'<style>
  .step_01 {display: none;}
  .step_02 {display: block;}
  .step_03 {display: none;} 
  .step_04 {display: none;}
  </style>';
};

// помилковий вхід в систему
if ($wrong_access_form===true){
  echo'<style>
  .step_01 {display: none;}
  .step_02 {display: none;}
  .step_03 {display: block;} 
  .step_04 {display: none;}
  </style>';
};
?>


//HTML частина

<html>

<div class="step_01">
<h4>Крок 1. Авторизація користувача!</h4>
<p>- Ви не авторизовані, введіть Логін та Пароль!</p>
<p>Наприклад: Логін: qwer , Пароль: 123</p>
<form action="php-обробник" method="POST">
<p><input name="login" required placeholder="login"></p>
<p><input type="password" name="password" ></p>
<p><input type="submit" name="submit" value="Вхід"></p>
</form>
</div>

<div class="step_02">
<h4>Крок 2. Вхід в систему!</h4>
<p>- Вітаю, Ви успішно увійшли на веб-ресурс!</p>
<p>При повторному відвідуванні цієї Демо-сторінки 
Ви зможете зайти не застосовуючи форму входу (Логін/Пароль).</p>
</div>

<div class="step_03">
<h4><Крок 2. Помилковий вхід до системи!</h4>
<p>- Ви помилились під час введення даних!</p>
<form action="php-обробник" method="POST">
<p><input name="login" required placeholder="login"></p>
<p><input type="password" name="password" ></p>
<p><input type="submit" name="submit" value="Вхід" </p>
</form>
</div>

<div class="step_04">
<h4>Крок 3. Автоматична авторизація користувача!</h4>
<<p>- Вітаю, Ви успішно авторизовані в системі на Демо-сторінці!</p>
<</div>

</html>


AfterWords

В поданій статті розглядався один із варіантів авторизації на веб-сайті користувачем із застосуванням файлу Coockies, коротке знайомство із методикою зберігання даних $_SESSION, хешуванням даних, обробкою даних на сервері php-обробником.

Ціллю статті було ознайомлення з основними елементами авторизації, що ж до методик чи алгоритмів програмування авторизації (методик шифрування паролей), то кожен програміст може створювати алгоритми кодування, збільшуючи чи навпаки зменшуючи кількість скриптів кодування на власний розсуд.



- Що ж тепер в мене є скрипт авторизації... :)

основа статті - травень 2015 року/ редакція лютий 2016...