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

Тема в разделе "PHP программирование", создана пользователем sergej-s38, 13 апр 2013.

  1. sergej-s38

    sergej-s38 New Member

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

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Допустим:
    1) index.php - главная страница сайта;
    2) download.php - страница со списком файлов для скачивания;
    3) files/ - подкаталог в котором лежат всякие файлы, в том числе и PDF-ки с "ограниченным доступом".
    Необходимо:
    Разрешить скачивание PDF-ок только со страницы download.php, причем только если посетитель предварительно посетил index.php.
    Приступаем.

    Этап первый - Зашита от "наглеца":
    Кладем в files/ файлик .htaccess следующего содержания
    Код (Text):
    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-ку напрямую.
    Это грубо конечно. Желательно провести более тонкую настройку. Например сделать перенаправление на главную страницу.
    Подробнее читайте тут:
    http://www.wmaster.ru/htaccess/
    http://www.internet-technologies.ru/articl...ticle_1381.html
    http://www.simplemachines.ru/index.php?topic=2442.0

    Этап второй - Зашита от "хитреца":
    В download.php проверяем откуда (с какой страницы) посетитель зашел на страницу.
    Код (Text):
          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) После обработки формы (вместо ссылочного перенаправления на файл) инициируем скачивание файла.
    "Со стороны" это выглядит как будто скачиваемый файл лежит в корне сайта. Хотя на самом деле мы то знаем что это не так... :)
    Вот пример функции делающей это:
    Код (Text):
    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. Подробнее читайте тут:
    http://php.net/manual/ru/function.readfile.php

    Вот собственно и всё... Не плохо бы защититься еще от двух парней, от дурака и м*д*ка... но это уже другая история... :)
    Полный код демонстрирующий всё вышеописанное тут:
    Посмотреть вложение www.rar
     
  3. sergej-s38

    sergej-s38 New Member

    Регистрация:
    2 мар 2013
    Сообщения:
    0
    Симпатии:
    0
    Спасибо за подсказку. :D
    А какая это версия php?
    И минимальные требования движка?
     
Загрузка...

Поделиться этой страницей