описание
Стартовая страницаНаписать письмоКаталог работ

Полезные утилиты

Паковшик JavaScript кода

Паковать Очистить

Полезные статьи

03.11.2010 - Совместное использование Ajax и Web-сервисов »
25.10.2010 - Ajax и Smarty: Часть 1. Разрабатываем Ajax-приложения с помощью Smarty »
18.10.2010 - Конфигурация и пакетирование виджетов W3C »
30.09.2010 - Создание Web-сервисов с защитой на транспортном уровне при помощи Rational Application Developer V7: Часть 3. Настройка HTTPS »
30.09.2010 - Проектирование и разработка Web-сервисов JAX-WS 2.0 »
30.09.2010 - Краткие основы SOA »

Ещё »



Все статьи

29.07.2010 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, который передан в строке запроса файла. Например строка
запроса файла выглядит так 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 и отдать юзеру. Что собственно нам и требовалось.


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





»

Назад к списку

Новости студии

С Новым Годом!
31.12.2009
Уважаемые клиенты студии и гости нашего сайта!
Коллектив студии программирования Bleaksoft искренне поздравляет Вас с наступающим годом Тигра, и желает счастья, радости и успехов в следующем году.
Пусть в любых начинаниях Вас преследует постоянная удача!
Трекер заданий
20.12.2009
Для повышения эффективности работы запущен трекер заданий, в котором клиенты студии могут оставлять свои технические задания и замечания по проектам.
JavaScript Packer
01.12.2009
Для удобства, на сайте запущен собственный паковщик и деобфускатор Java - скриптов
Все новости

Rambler's Top100 Яндекс индекс цитирования Рейтинг@Mail.ru