Временные ссылки на php. Что это такое и с чем их едят? Все очень
просто. Часто при построении какого-либо php движка возникает
необходимость размещения на страницах сайта, которым будет управлять
этот движок, ссылок на скачивание различных архивов с программами,
изображениями, шаблонов сайтов и т. п. В простейшем случае все это
можно снабжать прямыми линками на архивы, а сами архивы размещать в
незащищенной папке своего домена. Но такой путь не совсем верный.
Во-первых, линки на архивы могут быть скопированы на другие ресурсы и
скачивать их можно будет даже не заходя на ваш сайт. Во-вторых, из-за
того, что файлы будут размещены в незащищенной папке они могут быть
повреждены или даже стерты злоумышленниками.
Поэтому
наилучший способ, это отдавать линки на скачивание архивов с сайта по
так называемым временным ссылкам формируемым средствами PHP. Архивы при
этом могут быть запрятаны в любую папку любой директори сайта и
защищены от постороннего доступа файлом .htaccess.
Каков же
механизм формирования временных ссылок? Необходимо создать базу с двумя
таблицами. В первой будут находиться уникальные названия файлов для
скачивания с их атрибутами - расширение, описание, и т. п. В другой
будут создаваться временные строки с уникальными названиями файлов,
случайный хеш и время создания записи. Строки второй таблицы должны
формироваться при переходе на страницу для скачивания файла.
И как раз на базе второй таблицы и будут формироваться временные линки
на скачивание которые будут содержать в себе случайный хеш.
Задача
php обработчика для формирования временной ссылки состоит в нахождении
во второй таблице строку с хешем присутствующим в линке и извлечь из
этой строки id архива на скачивание, по которому затем в базе названий
архивов можно найти название нужного архива и отдать его на скачивание
пользователю.
Это можно организовать с использованием базы
MySQL. Но если база файлов небольшая то выгоднее это сделать на обычных
текстовых файлах, один из которых будет являться базой из названий
архивов и их атрибутов , а другой вместилищем для временных линков.
Такой механизм работает на ресурсе 'Электроника программирование
сайтостроение' php, html, css для любителей и профессионалов в разделе
'Шаблоны сайтов', который выполнен на базе CMS упомянутой в статье про
поисковую статистику. Допустим у нас есть два
текстовых файла
// файл-база для названий файлов
$namefiles = "namefiles.dat";
// файл-база для временных ссылок
$templinks = "templinks.dat";
Первый
- это база с названиями файлов в котором могут быть строки каждая из
которых имеет записи разделенные знаком '|'. Ясно что первая запись в
строке это уникальный id файла, вторая это его описание, третья -
название архива
001|Шаблон сайта ultra 77|templates1.rar
002|Шаблон сайта от Open Designs|templates2.rar
Второй - это файл для временных линков, которые будут туда записываться в строку.
Строка
будет содержать три поля разделенные все тем же знаком '|', первое -
уникальный id файла, второе - случайный хэш и третье - время
формирования строки. Ну а скрипт формирования временных линков, назовем
его например templinks.php, должен состоять из трех частей. Первая из
них это очистка файла временных линков с просроченным временем
существования. Выглядит это примерно так:
// сколько хранить ссылки (в секундах - 10 минут)
$hardtime = 600;
// текущее время в сек
$currtime = time();
// проверка и очистка временных строк
$arruniqid = file($templinks);
$newarruniqid = array();
for($i = 0; $i < count($arruniqid); $i++)
{
// строки таблицы временных уник. id
list($file_id,$uniq_id,$puttime) = explode("|",$arruniqid[$i]);
$difftime = $currtime - intval($puttime);
// если время текущей строки в пределе
if($difftime < $hardtime)
array_push($newarruniqid, "$file_id|$uniq_id|$puttime");
}
// составить матрицу таблицы временных id
$newtbdwn = implode("",$newarruniqid);
$fp=$wf->fopen($templinks,"w");
@fwrite ($fp,$newtbdwn);
fclose($fp, $templinks);
Вторая
часть - это получение строки из файла базы названий файлов,
соответствующей id, который передан в строке запроса файла. Например
строка запроса файла выглядит так
http://./templinks.php?getlink=001
if($_GET['getlink'])
{
// матрица названий файлов
$arrtbfl = file($namefiles);
foreach($arrtbfl as $key => $val)
{
list($id,$descr,$filename) = explode("|",$val);
if($id == $_GET['getlink'])
{
list($id,$descr,$filename) = explode("|",$val);
$nowid = $id;
break;
}
}
// генерировать уник. id
$arrtbunq = file($templinks);
$uniq_id = md5( uniqid(rand(), 1) );
array_push($arrtbunq, "$nowid|$uniq_id|$currtime\n");
// новая строка уник. id
$newtbunq = implode("",$arrtbunq);
// записать файл базы обратно
$fp=fopen($templinks,"w");
@fwrite ($fp,$newtbunq);
fclose($fp,$templinks);
// Ссылка для скачивания
$shlink = "href=http://./templinks.php?download=$uniq_id";
}
Третья
часть - это переход по сформированному временному линку для скачивания
нужного файла. Для этого нужно пройтись по базе временных линков и
найти какой строке базы соответствует наличие там $uniq_id чтобы потом
пройдясь по базе файлов найти там название архива соответствующее
найденному в базе временных линков $id.
if($_GET['download'])
{
$dwn = file($templinks);
foreach($dwn as $key => $val)
list($file_id,$uniq_id,$puttime) = explode("|",$val);
if(strstr($uniq_id ==
{
$id = $file_id
break;
}
}
Теперь у нас есть id файла по которому можно найти название самого файла в базе namefiles.dat и отдать юзеру. Что собственно нам и требовалось.
Подведем итоги. Описанный механизм позволяет формировать ссылки с управляемым временем существования и случайным параметром запроса. Что это дает? Скачать нужный файл юзер сможет только зайдя на нужную страницу вашего сайта. Невозможно будет скачать файл с другого домена по линку сформированному на вашем сайте, поскольку он имеет конечное короткое время существования. Ну, а вобщем это полезный способ для сохранения и приумножения трафика вашего сайта.
Автор: Yury Gusin, webscript.ru