(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

PHP скрипт скачивания файлов по временным ссылкам

Источник: webscript
Yury Gusin

Временные ссылки на 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 == $_GET['download'])
{
$id = $file_id
break; 
}
}

Теперь у нас есть id файла по которому можно найти название самого файла в базе namefiles.dat и отдать юзеру. Что собственно нам и требовалось.

Подведем итоги. Описанный механизм позволяет формировать ссылки с управляемым временем существования и случайным параметром запроса. Что это дает? Скачать нужный файл юзер сможет только зайдя на нужную страницу вашего сайта. Невозможно будет скачать файл с другого домена по линку сформированному на вашем сайте, поскольку он имеет конечное короткое время существования. Ну, а вобщем это полезный способ для сохранения и приумножения трафика вашего сайта. 

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 10.08.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Microsoft Office 365 для Дома 32-bit/x64. 5 ПК/Mac + 5 Планшетов + 5 Телефонов. Подписка на 1 год.
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год.
Microsoft Windows Professional 10, Электронный ключ
Microsoft 365 Business Standard (corporate)
Microsoft 365 Apps for business (corporate)
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Вопросы и ответы по MS SQL Server
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100