Створення одноразових URL-адрес

23

Від автора: при розробці веб-додатків іноді виникає завдання створення одноразових посилань для користувачів. Тобто посилань, які можна використовувати тільки один раз. Такі посилання можна використовувати як для скачування різного матеріалу на Вашому сайті, так і для активації нового зареєстрованого користувача. Тому в даному уроці ми з Вами розглянемо створення одноразових посилань на прикладі посилання для скачування файлу.

Створення одноразових URL-адресСтворення одноразових URL-адрес

1. Постановка задачі

Для початку давайте умовимося, що одноразову посилання ми будемо створювати для скачування файлу. Даний файл будемо зберігати в папці file і це звичайне зображення, яке необхідно для прикладу.

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

І останнє, необхідно забезпечити одноразове використання посилання. Тобто, будь-яку створену посилання, користувач зможе використовувати не більше одного разу. При повторному використанні посилання, доступ на скачування файлу необхідно заборонити. Тепер давайте приступимо до реалізації поставленої задачі.

2. Створення одноразових посилань

Отже, на локальному комп’ютері в папці lessons, я створив папку onetime, в якій ми будемо зберігати наш майбутній скрипт. Тобто шлях до папки з скриптом буде наступний: http://localhost/lessons/onetime/

Тепер, давайте створимо новий файл, за назвою get_hash.php, який буде генерувати унікальну рядок і тим самим формувати одноразову посилання для скачування файлу. Першим ділом, генеруємо унікальну рядок:

$hash = md5(microtime());

Для цього використовуємо функцію microtime(), яка повертає поточну мітку часу. Тобто в кожен момент часу ми будемо отримувати різне значення. Нагадаю, що обчислене значення це рядок виду: «msec sec», де sec являє собою поточний час, що минув з початку Епохи Unix (1 січня 1970 0:00:00 GMT) в секундах, а msec — це кількість мікросекунд, що минули після sec. Потім опрацюємо отримане значення функцією md5(), тобто зашифруем отриманий рядок однонаправленим алгоритмом шифрування md5 (односпрямоване – означає, що можна зашифрувати дані, але не можна розшифрувати). Давайте виведемо на екран значення змінної $hash:

Створення одноразових URL-адрес

Як Ви бачите, рядок успішно генерується. Далі, створюємо змінну $file, в якій будемо зберігати ім’я файлу, в якому будуть зберігатися створені унікальні рядки для посилань:

Тепер, створену рядок необхідно зберегти у файлі, тому, давайте відкриємо текстовий файл для запису:

$fd = fopen($file,»a»);
if(!$fd) {
exit(«Не можливо відкрити файл»);
}

Для відкриття файлу для запису використовуємо функцію fopen(). Яка відкриває файл в певному режимі. Ми будемо працювати в режимі a, тобто, відкриваємо файл тільки для запису і переміщаємо курсор у кінець файлу (якщо ми викликаємо функцію в перший раз, то відкривається файл буде створений).

Тепер, для запобігання появи помилок, пов’язаних з постійним зверненням до файлу, необхідно блокувати його на час запису даних. Тобто при генерації посилання, виконується запис унікальною рядки в файл. Потім, ми з Вами будемо постійно зчитувати дані файлу, для перевірки правильності рядків. При цьому можуть виникати помилки при численних зверненнях до файлу в один і той же момент часу (тобто запис і зчитування даних відбувається практично одночасно). Тому перед записом даних ми з Вами заблокуємо файл функцією flock():

if(!flock($fd,LOCK_EX)) {
exit(«Блокування файлу не вдалася»);
}

Нагадаю, що дана функція накладає блокування на файл. Режим роботи якої визначається константами, що передаються другим параметром до даної функції. Режим LOCK_EX – накладає ексклюзивну блокування (запис). І при цьому всі можливі звернення файлу будуть заборонені, тобто поки він заблокований. Окрім запису даних у файл з нашого скрипта, що власне ми і виконаємо:

fwrite($fd,$hash.»\n»);

Для запису ми використовуємо функцію fwrite, і записуємо згенероване унікальну рядок. Тепер давайте розблокуємо файл, тобто, дозволимо звернення до нього з неба і закриємо файл:

if(!flock($fd,LOCK_UN)) {
exit(«Не можливо розблокувати файл»);
}
fclose($fd);

Для розблокування доступу до файлу, ми використовуємо функцію flock(), і передаємо константу LOCK_UN, тобто зняття блокувань. Тепер, давайте кілька разів оновимо скрипт і подивимося, що записано у файл:

Створення одноразових URL-адрес

Як Ви бачите, дані в файл успішно записані. Тепер необхідно сформувати посилання і відобразити її на екрані для користувача:

$path = substr($_SERVER[‘PHP_SELF’],0,strrpos($_SERVER[‘PHP_SELF’],»/»));
echo «

Ваша посилання для скачування

«;
echo «http://».$_SERVER[‘HTTP_HOST’].$path.»/get_file.php?hash=».$hash.»»;

Для цього нам необхідно визначити папку, в якій міститься скрипт. Тому, використовуючи функцію substr, ми отримуємо ім’я папки і зберігаємо в змінної $path. Потім виводимо на екран посилання, використовуючи клітинку суперглобального масиву $_SERVER[‘HTTP_HOST’] і отриману змінної $path. Так само додаємо ім’я файлу обробника, в нашому випадку це get_file.php і, використовуючи GET параметри, передаємо згенеровану рядок. Тепер давайте перейдемо в браузер і подивимося, що у нас вийшло:

Створення одноразових URL-адрес

Як Ви бачите, посилання виводиться, унікальна рядок генерується і записується в текстовий файл. Значить, ми все зробили правильно. Тепер на всяк випадок приведу повний код файлу, get_hash.php: