2011-07-29 5 views
1

В настоящее время я пишу класс загрузки для загрузки изображений. Я выполняю проверки расширений, чтобы убедиться, что загруженные изображения поддерживаются типами, а фотографии всегда являются 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()); 
} 
+0

Чтобы быть уверенным, что ничто никогда не будет выполнено каким-либо образом, просто создайте вокруг него сценарий оболочки. Сценарий обертки должен делать заголовок («Content-type: $ mime_type») и выгружать содержимое файла в stdout. Чтобы определить тип mime, проверьте расширение fileinfo pecl (http://us3.php.net/manual/en/ref.fileinfo.php). – Friek

ответ

1

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

+0

, так что просто удостоверьтесь в разрешениях, меньше заботитесь о расширениях. ;) – VOX

+0

Так что, вероятно, не может быть намного безопаснее, чем проверка расширения, проверка мимики и обеспечение того, чтобы в любом месте пользователи могли загружать файлы, эти файлы всегда сохраняются в чем-то вроде 644. Большое спасибо всем проницательным парням! – Throttlehead

2

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

Смежные вопросы