Разработка на PHP: Как безопасно загрузить файл изображения на сервер и проверить его расширение и размер?

Безопасная загрузка файлов изображений на сервер — одна из ключевых задач при разработке веб-приложений на PHP. Неправильная реализация может привести к серьёзным уязвимостям, включая загрузку вредоносных скриптов. Рассмотрим пошаговый подход к реализации безопасной загрузки.

**1. HTML-форма для загрузки файла**

Для начала создайте форму с атрибутом `enctype=»multipart/form-data»`:

html

**2. Проверка расширения файла**

Нельзя доверять расширению из имени файла напрямую — его легко подделать. Используйте функцию `pathinfo()` в связке с белым списком допустимых расширений:

php
$allowedExtensions = [‘jpg’, ‘jpeg’, ‘png’, ‘gif’, ‘webp’];
$fileExtension = strtolower(pathinfo($_FILES[‘image’][‘name’], PATHINFO_EXTENSION));

if (!in_array($fileExtension, $allowedExtensions)) {
die(‘Недопустимое расширение файла.’);
}

**3. Проверка MIME-типа через finfo**

Для надёжной проверки типа файла используйте расширение `finfo`, которое анализирует содержимое файла, а не его имя:

php
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($_FILES[‘image’][‘tmp_name’]);
$allowedMimes = [‘image/jpeg’, ‘image/png’, ‘image/gif’, ‘image/webp’];

if (!in_array($mimeType, $allowedMimes)) {
die(‘Недопустимый тип файла.’);
}

**4. Проверка размера файла**

Ограничьте максимальный размер загружаемого файла. Например, не более 2 МБ:

php
$maxFileSize = 2 * 1024 * 1024; // 2 MB в байтах

if ($_FILES[‘image’][‘size’] > $maxFileSize) {
die(‘Файл слишком большой. Максимальный размер — 2 МБ.’);
}

**5. Проверка ошибок загрузки**

Всегда проверяйте код ошибки из массива `$_FILES`:

php
if ($_FILES[‘image’][‘error’] !== UPLOAD_ERR_OK) {
die(‘Ошибка при загрузке файла: ‘ . $_FILES[‘image’][‘error’]);
}

**6. Генерация уникального имени файла**

Никогда не используйте оригинальное имя файла — это может привести к перезаписи существующих файлов или path traversal атакам:

php
$newFileName = bin2hex(random_bytes(16)) . ‘.’ . $fileExtension;
$uploadDir = __DIR__ . ‘/uploads/’;
$destination = $uploadDir . $newFileName;

**7. Перемещение файла в папку загрузок**

php
if (!move_uploaded_file($_FILES[‘image’][‘tmp_name’], $destination)) {
die(‘Не удалось сохранить файл.’);
}

echo ‘Файл успешно загружен: ‘ . $newFileName;

**8. Дополнительные меры безопасности**

— Убедитесь, что папка `uploads/` не имеет прав на выполнение PHP-скриптов (настройте `.htaccess` или конфигурацию сервера).
— Проверяйте, что файл действительно является изображением с помощью `getimagesize()`:

php
if (!getimagesize($_FILES[‘image’][‘tmp_name’])) {
die(‘Файл не является изображением.’);
}

— Настройте в `php.ini` параметры `upload_max_filesize` и `post_max_size`.
— Храните загруженные файлы вне корневой директории веб-сервера, если возможно.

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


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.