WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




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


Прислал: Yury Gusin [ 29.07.2010 @ 12:14 ]
Раздел:: [ Статьи по PHP ]


Временные ссылки на 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, который передан в строке запроса файла. Например строка запроса файла выглядит так //.../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=//.../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.2010 @ 09:15 
Спасибо, за интересную статью.
Как Вы организовываете механизм отдачи файла? Как при этом от пользователей остаются скрыты оригинальные каталоги и имена файлов. Скрипт, который обрабатывает хэш-ссылку, просто выводит оригинальную ссылку для браузера в команде echo, или скрипт создает новый заголовок, изменяя location? Или же что-то другое?

 :::::  Yury пишет 05.09.2010 @ 23:52 
1. Механизм отдачи файла можно посмотреть в исходниках Acvarif-CMS ссылка на которую в этой статье http://webscript.ru/stories/10/07/22/1360178
2. Нет смысла скрывать названия файлов (хотя они действительно скрыты), поскольку все файлы запрятвны под .htaccess. Файлы напрямую недоступны.
3. Для браузера каждый раз выводится уникальная ссылка на время указанное в настройках сайта (смотрите исходники CMS). Кроме того скачать файл можно только попав на страницу скачивания с самого сайта, а не с какого лио другого ресурса.
 :::::   пишет 06.09.2010 @ 17:17 
К вас же написано // Ссылка для скачивания - еще и жирным выделено, но по этой ссылке ничего не
качает, программа слегка не завершена
 :::::  Станислав пишет 20.09.2010 @ 16:20 
Спасибо за материал.
Хотелось статей для .net

С уважением.
 :::::  Barabans пишет 20.09.2010 @ 17:16 
Это больше подходит к drupal? Подойдет вообщем-то для любой CMS,но к чему данный скрипт?
 :::::  Oleg пишет 30.11.2010 @ 20:37 
Как думаете есть ли смысл на wordpress или на Джумлу ставить?
 :::::  Krolik_muzikant пишет 29.11.2011 @ 17:25 
Установил себе на DLE, работает гуд))
 :::::  Tori пишет 25.03.2012 @ 11:40 
Спасибо. Полезно.
 :::::  victor пишет 21.04.2012 @ 17:22 
а меня больше интересует "обратный процесс"(ну просто в познавательных целях)
как отправить запрос серверу,получить от него нужное,
а затем передать это другому клиенту.
ВОТ КАК ЭТО ОРГАНИЗОВАТЬ???
против сервера который "ЗАЩИТИЛ СЕБЯ" выше описанным способом.
а зная ЭТО ,можно использовать как и во благо так и во вред.
ЗНАНИЯ = вообще "палка о двух концах"

(если есть ответ и не лень написать - то можно в почту)
 :::::  Дима Мозг пишет 20.08.2012 @ 13:07 
Ваш метод не подходит для больших файлов. fread при размере файла 65 mb убивает сервер и пользователь види 504 ошибку. Ищу метод без считатывания файла...
 :::::  Николай пишет 09.07.2013 @ 12:08 
Один сайт запускается с другого ссылкой. Подскажите, пожалуйста: КАК СДЕЛАТЬ ВРЕМЯ ДЕЙСТВИЯ
ССЫЛКИ НА САЙТ ВРЕМЕННЫМ (НЕСКОЛЬКО ЧАСОВ - МИНУТ). С уважением Николай.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0305300