Безопасная загрузка файлов в PHP7

Безопасная загрузка файлов в PHP7.

Загрузка файлов актуализирует по сути две опасности, обсужденные ранее: опасность модификации пользователем данных и опасность несанкциони­рованный действий с файловой системой. Несмотря на то, что язык РНР 5 сам по себе реализует некоторые функции безопасности в том, как он обра­батывает загруженные файлы, есть несколько потенциальных ловушек, за­щититься от которых можно только на программном уровне и в котороые часто попадают начинающие неосторожные разработчики.

Не доверяйте предоставленным браузером именам файлов Об этом мы уже говорили немного ранее. Будьте очень осторожны при ис­пользовании имен файлов, полученных вашим сценарием от браузера. Если возможно, вообще не используйте такое имя в качестве имени файла в ва­шей файловой системе. Очень просто заставить браузер отправить файл, ко­торый будет идентифицирован как /etc/passwd или /home/msmus/.fomard. Как вариант, вы можете использовать имя файла, предоставленное браузе­ром, для взаимодействия с пользователем, но для обращения к загруженно­му файлу сгенерируйте вручную уникальное имя. Например:

$browserName = $_FILES[‘image’][‘name’];

$tempName = $_FILES[‘image’][‘tmp_name’];

echo «Спасибо за отправку мне {$browserName}.»;

$counter++; / / постоянная переменная $filename = «image_ {$counter}»;

if (is_uploaded_file($tempName)) {

move_uploaded_file($tempName, «/web/images/ {$filename}»); }

else {

diе(«Проблема при обработке файла.»);

}

Остерегайтесь заполнения вашей файловой системы

Еще одна ловушка — размер загруженных файлов. Несмотря на то, что вы можете указать браузеру максимальный размер файла, который может за­грузить пользователь, это лишь рекомендация и нет никакой гарантии, что вашему сценарию не отправят файл большего размера. Атакующие могут выполнить атаку “отказ в обслуживании”, отправив файлы, достаточно большие, чтобы заполнить файловую систему вашего сервера.

Чтобы избежать подобных неприятностей, используйте параметр конфи­гурации post_max_size в файле php.ini, устанавливающий максимальный размер данных, которые можно отправить методом POST:

post_max_size = 1024768;

После этого РНР будет игнорировать запросы с объемом данных, превы­шающим указанный размер. Значение по умолчанию — 10 Мб — это гораздо больше, чем нужно большинству сайтов.

Осторожно! register_globals

Сразу же отметим, что данная проблема в принципе является устаревшей и начиная с версии РНР 5.4.0 полностью удалена. Однако, если у вас используется более старая версия РНР (до 5.4.0. )рекомендуем прочитать данный небольшой раздел. Порядок обработки ■ переменных задается параметром конфигурации variables_order, по умолчанию параметры GET и POST обрабатываются перед Cookies. Это позволяет пользователю отправить Cookie, которая пе­резапишет глобальную переменную, содержащую информацию о загружен­ном файле. Чтобы избежать этого, нужно проверить, что данный файл был загруженным, для этого используется функция is_uploaded_file().

Например:

$uploadFilepath = $_FILES[‘uploaded’][‘tmp_name’];

if (is uploaded file($uploadFilepath)) {

$fp = fopen($uploadFilepath, ‘r’);

if ($fp) {

$text = fread($fp, filesize($uploadFilepath)); fclose($fp);

// сделать что-то с содержимым файла ) }

РНР предоставляет функцию move_uploaded_file(), которая перемещает файл только, если он был загружен. Лучше использовать эту функцию, чем функцию системного уровня или функцию РНР сору(}. Например, следу­ющий код не может быть скомпрометирован с использованием Cookies:

move_uploaded_file($_REQU EST[‘file’], ”/new/name.txt”);

К слову, если вы уже создали свой сайт на PHP — можно попытаться продвинуть его самостоятельно, используя популярные социальные платформы, в частности Instagram. Освоить азы эффективного ведения и продвижения instasec.ru своей страницы в Instagram можно перейдя по ссылке. Остается пожелать успехов в создании и продвижении своих проектов на PHP!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *