Подскажите, пожалуйста, код на php, который закроет этот свободный доступ и разрешит закачивать файлы только, если запрос идет с самого сайта (по ссылке на его странице). Желательно, если этот код будет еще и сам создавать список файлов для вывода на страницу, считывая не только файлы, но и txt-описания (к каждому из них отдельное и одноименное).
Спасибо за помощь.
Допустим:
1)
index.php - главная страница сайта;
2)
download.php - страница со списком файлов для скачивания;
3)
files/ - подкаталог в котором лежат всякие файлы, в том числе и PDF-ки с "ограниченным доступом".
Необходимо:
Разрешить скачивание PDF-ок только со страницы download.php, причем только если посетитель предварительно посетил index.php.
Приступаем.
Этап первый - Зашита от "наглеца":
Кладем в
files/ файлик
.htaccess следующего содержания
Код:
Options -Indexes
<FilesMatch "\.(pdf|PDF)$">
order allow,deny
deny from all
</FilesMatch>
ErrorDocument 403 "Access Denied!"
Строка
Options -Indexes - запрещает обзор каталога
files/ (по ссылке http : //mysite/files/)
Строки группы
FilesMatch - запрещают скачивание файлов с расширением
*.PDF (по ссылке типа http : //mysite/files/sample1.pdf)
Строка
ErrorDocument 403 "Access Denied!" - задает текст который увидит "наглец" попытавшись просмотреть каталог или скачать PDF-ку напрямую.
Это грубо конечно. Желательно провести более тонкую настройку. Например сделать перенаправление на главную страницу.
Подробнее читайте тут:
Ссылка скрыта от гостей
Ссылка скрыта от гостей
Ссылка скрыта от гостей
Этап второй - Зашита от "хитреца":
В
download.php проверяем откуда (с какой страницы) посетитель зашел на страницу.
Код:
if (basename($_SERVER["HTTP_REFERER"]) !== 'index.php') {
header("Location: /index.php");
die();
}
$_SERVER[HTTP_REFERER] - содержит URL страницы, с которой пришел посетитель.
Строка
header("Location: /index.php"); - инициирует перенаправление на главную страницу сайта.
Строка
die(); - останавливает выполнение php скрипта на этой странице.
Результат : "Хитрец" попытавшийся попасть на страницу загрузок минуя главную страницу (по прямой ссылке http : //mysite/files/download.php) будет тихо и не навязчиво отправлен на...
index.php. Это по доброму
Этап третий - Зашита от "мудреца":
1) На странице со списком загрузок (
download.php) мы вообще не даем информации о том где на самом деле лежат файлы (никаких прямых ссылок, только названия с описанием).
2) Имя файла для загрузки передаем отсылкой формы методом POST.
3) После обработки формы (вместо ссылочного перенаправления на файл) инициируем скачивание файла.
"Со стороны" это выглядит как будто скачиваемый файл лежит в корне сайта. Хотя на самом деле мы то знаем что это не так...
Вот пример функции делающей это:
Код:
function force_download ($filename) {
$filename = realpath($filename);
$file_extension = strtolower(substr(strrchr($filename,"."),1));
switch ($file_extension) {
case "pdf": $ctype = "application/pdf"; break;
case "exe": $ctype = "application/octet-stream"; break;
case "zip": $ctype = "application/zip"; break;
case "doc": $ctype = "application/msword"; break;
case "xls": $ctype = "application/vnd.ms-excel"; break;
case "ppt": $ctype = "application/vnd.ms-powerpoint"; break;
case "gif": $ctype = "image/gif"; break;
case "png": $ctype = "image/png"; break;
case "jpe": case "jpeg":
case "jpg": $ctype = "image/jpg"; break;
default: $ctype = "application/force-download";
}
if (!file_exists($filename)) {
die("NO FILE HERE");
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".@filesize($filename));
set_time_limit(0);
@readfile("$filename") or die("File not found.");
}
Возможны варианты для force_download. Подробнее читайте тут:
Ссылка скрыта от гостей
Вот собственно и всё... Не плохо бы защититься еще от двух парней, от дурака и м*д*ка... но это уже другая история...
Полный код демонстрирующий всё вышеописанное тут:
Посмотреть вложение www.rar