• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Подскажите Код На Php

  • Автор темы sergej-s38
  • Дата начала
S

sergej-s38

Привет всем.
Может подскажет кто код на php?
Ситуация -
Есть сайт закрытый для свободного просмотра (только для зарегиных).
На сайте каталог pdf, в нем файлы *.pdf, они доступны всем через прямой запрос в адресной строке браузера (пример запроса .
Эта доступность любому и есть проблема.
Подскажите, пожалуйста, код на php, который закроет этот свободный доступ и разрешит закачивать файлы только, если запрос идет с самого сайта (по ссылке на его странице). Желательно, если этот код будет еще и сам создавать список файлов для вывода на страницу, считывая не только файлы, но и txt-описания (к каждому из них отдельное и одноименное).
Спасибо за помощь.
 
S

sinkopa

Подскажите, пожалуйста, код на 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
 
S

sergej-s38

Спасибо за подсказку. :D
А какая это версия php?
И минимальные требования движка?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!