Загрузка файлов актуализирует по сути две опасности, обсужденные ранее: опасность модификации пользователем данных и опасность несанкционированный действий с файловой системой. Несмотря на то, что язык РНР 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!
Добавить комментарий