|
Навигация
|
Главная » Sql 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 и отдать юзеру. Что собственно нам и требовалось. Подведем итоги. Описанный механизм позволяет формировать ссылки с управляемым временем существования и случайным параметром запроса. Что это дает? Скачать нужный файл юзер сможет только зайдя на нужную страницу вашего сайта. Невозможно будет скачать файл с другого домена по линку сформированному на вашем сайте, поскольку он имеет конечное короткое время существования. Ну, а вобщем это полезный способ для сохранения и приумножения трафика вашего сайта. Объекты в Oracle - это очень просто. Аналитические функции в Oracle (Часть 2). Выводимые таблицы с хранимым результатом. Часть 1. Docsvision показала 100% совместимость с Microsoft SQL Server 2012.. Утилита SQL*Plus. Создание и выполнение сценариев. Часть III. Главная » Sql |
© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено. |