У меня есть форма, которую пользователь заполняет лирикой и загружает обложку альбома. Представленные данные будут вставлены в базу данных, а обложка альбома будет перенесена в подпапку.
localhost/project-folder/covers
Я принял некоторые меры предосторожности (экранирование, подготовленные заявления) против SQL Injection для ввода формы. Недавно я узнал, что мне также необходимо принять меры предосторожности при загрузке файла (изображения), чтобы пользователь мог загружать вредоносные изображения.
Например, добавление кода HTML, JS или PHP в метаданные изображения или вложение кода непосредственно в файл изображения . Поскольку я не использовал PHP широко, я не понимаю, как это создает проблему, особенно в моем случае.
Я выполняю проверку формы на стороне сервера.
локальный / проект папка / текст / add.php
<form action="../scripts/lyrics/submit_lyrics.php" id="lyricsForm" method="post" autocomplete="off" enctype="multipart/form-data">
локальный / проект папка / скрипты / текст / submit_lyrics.php
$form_data = new FormData(["artist", "album", "song", "year", "track_no", "lyrics"], "sssiis"); $file_data = new FileUpload("cover", [ "max_file_size" => 512 * 1024, "extensions" => ["gif", "jpg", "jpeg", "png"], "mimes" => ["image/gif", "image/jpeg", "image/png"], "max_width" => 1024, "max_height" => 1024, ]); $cover = new Cover($mysqli, $form_data, $file_data, BASE."covers/");
Проверка выполняется при инициализации FormData
и FileUpload
. Если есть недопустимое поле или загруженное изображение недействительно, пользователь перенаправляется обратно на страницу формы (add.php) с соответствующими предупреждениями.
Одним из способов предотвращения загрузки вредоносного изображения, который я прочитал, было создание нового изображения из загруженного, и именно это я делаю внутри new Cover()
. Я также изменяю размер загруженного изображения, чтобы этот подход работал. Я делаю изменение размера с помощью этой функции:
public function new_image($file_data, $new_width, $new_height) { $img_data = file_get_contents($file_data->tmp_name); $image_type = $file_data->type; $img_create = null; switch ($image_type) { case IMAGETYPE_GIF: $img_create = "imagecreatefromgif"; break; case IMAGETYPE_JPEG: $img_create = "imagecreatefromjpeg"; break; case IMAGETYPE_PNG: $img_create = "imagecreatefrompng"; break; } $uploaded_image_resource = $img_create($file_data->tmp_name); $new_image_resource = imagecreatetruecolor($new_width, $new_height); imagecopyresampled($new_image_resource, $uploaded_image_resource, 0, 0, 0, 0, $new_width, $new_height, $file_data->image["width"], $file_data->image["height"]); return $new_image_resource; } public function write_to_disk() { if (isset($this->image["resource"])) { $destination = $this->target_dir . $this->file_name . ".jpg"; imagejpeg($this->image["resource"], $destination); imagedestroy($this->image["resource"]); } }
Это изменение размера также удаляет (я думаю) любой код в метаданных и / или код, встроенный в изображение (если они есть), так как я создаю новое чистое изображение.
Этого достаточно для защиты от загрузки файлов? Я что-то пропустил? Есть ли другие вещи, о которых мне нужно знать?