Разработка и продвижение сайтов в Санкт-Петербурге Разработка и продвижение сайтов в Санкт-Петербурге

Создаём лучшие сайты для процветания Вашего бизнеса

Полезные мелочи для разработчиков
PHP скрипт для скачивания файлов
Занятные
мысли вслух

Когда Вы уклоняетесь от налогов, где-то плачет ребёнок чиновника, которому не хватает на кокаин.

Тот факт, что медуза выжила 650 миллионов лет без мозгов, даёт надежду многим людям.

ЗАВТРА (сущ.) - мистическое место, где хранится вся человеческая продуктивность, мотивация и достижения.

Если Ваш ребёнок заболел после крещенского купания в двадцатиградусный мороз - значит в нём бес, окуните его ещё разок.

"Деньги не сделают тебя счастливее!" - Уверен, что грустнее и несчастнее они меня тоже не сделают.

Жена с черным поясом по каратэ - это крепкая семья, воспитанные дети, вежливая свекровь, любящий и верный муж.

В день человеку для счастья нужно 8 поцелуев, 20 минут любовных объятий, 2 шоколадки, 3 чашечки кофе, один "Rolls-Royce" и 748 тыс. долларов наличными.

Чтобы создать себе проблему, Вам потребуется ничего и женщина.

Разработка и продвижение сайтов в Санкт-Петербурге. Полезные мелочи для разработчиков: PHP скрипт для скачивания файлов

Предлагаю Вашему вниманию  PHP скрипт для скачивания файлов с Вашего сайта (разумеется, тех, что подлежат скачиванию). Данный скрипт не даёт браузерам запускать ассоциированную программу с данным файлом по умолчанию (mp3, doc, pdf и т.д.), а всегда спрашивать у пользователя что нужно делать (открыть или сохранить).

Также в данном скрипте есть защита от злонамеренного скачивания остальных файлов сайта напрямую из адресной строки браузера. Ниже обьясню суть этой проблемы.

1.Создаём в главной (ну, или в какой другой - где Вам удобно) директории сайта папку  files  - в ней будут распологаться сами файлы для скачивания и ещё парочка файлов:

2.Создаём файл-заглушку  index.php  - пустой или с содержимым вроде этого:

<?php echo 'Какого чёрта ты здесь забыл?' ?>

и помещаем его в папку  files 

3.Создаём файл  dl_save.php  , копируем туда этот код:

<?php

$filename = $_GET['filename'];


   // нужен для Internet Explorer, иначе Content-Disposition игнорируется

if(ini_get('zlib.output_compression'))

   ini_set('zlib.output_compression', 'Off');


$file_extension = strtolower(substr(strrchr ($filename, ″.″),1));


if( $filename == ″″ )

{

         echo ″ОШИБКА: не указано имя файла.″;

         exit;

} elseif ( ! file_exists( $filename ) )   // проверяем существует ли указанный файл

{

         echo ″ОШИБКА: данного файла не существует.″;

         exit;


   // защита от попыток скачать программные файлы сайта, напр, config.php

} elseif ( preg_match(″#^\.\./#″, $filename) == 1){

         header(″Location: index.php″);

         exit;

}

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 ″mp3″: $ctype= ″audio/mp3″; break;

         case ″gif″: $ctype= ″image/gif″; break;

         case ″png″: $ctype= ″image/png″; break;

         case ″jpeg″:

         case ″jpg″: $ctype= ″image/jpg″; break;

         default: $ctype= ″application/force-download″;

}

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));

readfile(″$filename″);

exit();

?>

и также помещаем его в папку  files .

Ссылка на скачивание файла оформляется так:

<a href=″files/dl_save.php?filename=file.pdf″>Скачать</a>

где file.pdf заменяется своим файлом и, при необходимости, прописывается нужный путь к папке  files .

Если через редирект:

header(″Location: files/dl_save.php?filename=file.pdf″);

Теперь обьясню, в чём была проблема с защитой.

Доступ к файлам и их обработка идёт через скрипт файла  dl_save.php , лежащего в папке  files , и сам скрипт проверяет и обрабатывает файлы, лежащие в той же папке  files .

Однако существовала возможность выйти за пределы данной папки: стоило кому нибудь ввести в адресной строке браузера нечто вроде:

files/dl_save.php?filename=../config.php

- был бы скачан конфигурационный файл Вашего сайта и воспос взлома стал бы вопросом ближайшего времени. Для защиты от этого я и добавил нужные строки в данный скрипт.

Всё. Удачи Вам!