Загрузка файлов и безопасность

В настоящее время я пишу класс загрузки для загрузки изображений. Я выполняю проверки расширений, чтобы убедиться, что загруженные изображения поддерживаются типами, а фотографии всегда являются chmod (0664), когда загруженный файл копируется в место отдыха. Это относительно безопасно? Я не очень разбираюсь в кодировании изображений, но даже если кто-то столкнулся с проблемой как-то обмануть мою проверку расширения, файл никогда не будет запущен на сервере, если бы не было отверстия безопасности в другом месте, и злоумышленники уже попали в мой файл система, правильно? Вот моя проверка расширения:

function validate_ext() { //Function validates that the files extension matches the list of allowed extensions $extension = $this->get_ext($this->theFile); $ext_array = $this->extensions; if (in_array($extension, $ext_array)) { //Check if file's ext is in the list of allowed exts return true; echo "ext found"; } else { $this->error[] = "That file type is not supported. The supported file types are: ".$this->extString; return false; } } 

И вот функция, которая копирует загруженный файл в место последнего отдыха.

 if ($_FILES[$this->uploadName]['error'] === UPLOAD_ERR_OK){ $newfile = $this->uploadDir.$this->theFile; if (!move_uploaded_file($this->tempFile, $newfile)) { $this->error[] = "The file could not be moved to the new directory. Check permissions and folder paths."; die($this->error_text()); }else{ $this->error[] = "The file ".$this->originalName." was successfully uploaded."; if ($this->renameFile == true){ $this->error[] = $this->originalName." was renamed to ".$this->theFile; } chmod($newfile , $this->fileperm); } }else{ $this->error[] = $this->file_upload_error_message($_FILES[$this->uploadName]['error']); die($this->error_text()); } 

Solutions Collecting From Web of "Загрузка файлов и безопасность"

В мире Linux до тех пор, пока u дал файлу неисполняемое разрешение, файл не может выполнить. Будь то .jpeg или это .bash. Это верно и наоборот, также может быть выполнено .jpeg с исполняемым разрешением (если содержимое этого файла .jpeg является исполняемым файлом, а не содержимым изображения).

Чтение расширения действительно не является хорошим способом проверки типа файла. Вы должны прочитать файл mime type …, который может быть фальшивым, но его больше хлопот, чтобы подделать.

Вы можете использовать getimagesize () для проверки самого файла.