Как определить, является ли выбранное изображение для загрузки действительным? - PullRequest
0 голосов
/ 29 марта 2012

Я реализую скрипт для проверки изображения для загрузки с помощью php. На самом деле, скрипт php хорошо работает с файлами изображений gif, png и jpg, но когда у меня есть одно условие:

  1. Я взял изображение theFileName.bmp и переименовал его расширение в theFileName.jpg.
  2. Затем я выбираю переименованный файл для загрузки.

Я переименовал имя файла изображения вручную на своем компьютере, а затем выбрал файл для загрузки.

Процесс загрузки занимает около 2 или 3 секунд, после чего ничего не появляется (даже ошибка), отображается только сообщение по умолчанию из браузера:

Соединение с localhost было прервано.

Как я могу запретить пользователю выбирать файл изображения (и любой другой файл в этом отношении), который не является действительным действительным изображением?

Решения здесь

Наконец, мне удалось придумать свои собственные решения. Это немного долго, но по крайней мере это может сделать работу! Надеюсь, это кому-нибудь поможет.

  1. Помогает предотвратить загрузку пользователем ненужного mime-типа
  2. Запретить пользователю использовать текстовый файл и переименовать его расширение и т. Д.
  3. Запретить пользователю использование текстового файла и изменение его типа mime
  4. Предотвратить из файла непрочитанное
  5. Запретить из файла содержит ошибку
  6. Запретить загрузку не http
  7. Запретить из изображения размер файла ширина: 0, высота: 0
  8. Есть еще много вещей, которые нужно проверить и проверить, чтобы убедиться, что это безопасно с помощью этих средств.

    # CHECK & TRY READ IMAGE FILE
    function is_readable_image( $theTmpFileloc ){
        try {
            if ( !getimagesize( $theTmpFileloc ) ){
                # THE IMAGE IS UNREADABLE
                return false;
            }
            # THE IMAGE IS READABLE
            return true;
    
        }catch( Exception $e ){
            # THE IMAGE IS OTHER FILE
            return false;
        }
    }
    # READ AND RETURN AN ARRAY OF IMAGE SIZES
    function get_image_size( $theTmpFileloc ){
        $imageSizes = array();
        $tmpResults = getimagesize( $theTmpFileloc );
        $imageSizes['width']  = $tmpResults[0];
        $imageSizes['height'] = $tmpResults[1];
    
        # IF EITHER WIDTH OR HEIGHT = 0, RETURN FALSE
        if ( $tmpResults[0] == 0 || $tmpResults[1] == 0 ) {
            return false;
        }
    
        return $imageSizes;
    }
    # READ AND RETURN AN IMAGE ACTUAL MIMETYPE
    function get_image_mime( $theTmpFileloc ){
        $imageMime  = '';
        $tmpResults = getimagesize( $theTmpFileloc );
        $imageMime  = $tmpResults['mime'];
    
        return $imageMime;
    }
    
    # START OF PHP TO VALIDATE IMAGE FILE
    if ( isset($_FILES['postImage']) && !empty($_FILES['postImage']['name']) ) {
        $tmpFileLoc      = $_FILES['postImage']['tmp_name'];
        $array_file_type = array('image/gif', 'image/png', 'image/x-png', 'image/jpeg', 'image/pjpeg');
    
        if ( $_FILES['postImage']['error'] == 1 ) {
            # THE IMAGE FILE CONTAINS ERROR
            $resMessage['Error']        = true;
    
        }elseif ( !is_uploaded_file( $tmpFileLoc ) ) {
            # PREVENT FROM UPLOADING FROM EXTERNAL SOURCE NOT HTTP
            $resMessage['Error']        = true;
    
        }elseif ( !is_readable_image( $tmpFileLoc ) ) {
            # PREVENT FROM IMAGE IS INVALID OR OTHER MIMETYPE
            $resMessage['Error']        = true;
    
        }elseif ( !get_image_size( $tmpFileLoc ) ) {
            # PREVENT FROM IMAGE SIZE 0, 0 OR INVALID ACTUAL MIMETYPE
            $resMessage['Error']        = true;
    
        }elseif ( !in_array( get_image_mime( $tmpFileLoc ), $array_file_type) ) {
            # LEVEL 2 OF CHECKING AN IMAGE MIMETYPE
            $resMessage['Error']        = true;
    
        }else {
            # other checks with file extension, max_size, 
            # dir is_writable and so on then move to move_uploaded_file
        }   
    }
    

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Для большей безопасности вашего php-скрипта вы должны использовать getimagesize (). Если он возвращает FALSE, это не изображение. Попробуйте также убедиться, что файл не слишком маленький. Кроме того, вы можете использовать библиотеку GD.

Извините за задержку. Вы должны дать нам хороший пример в следующий раз, LOL.

0 голосов
/ 29 марта 2012

Попробуйте этот код

<?php
if (isset($_FILES['photo']))
{
    $mimetype = mime_content_type($_FILES['photo']['tmp_name']);
    if(in_array($mimetype, array('image/jpeg', 'image/gif', 'image/png'))) {
      move_uploaded_file($_FILES['photo']['tmp_name'],
      '/images/' . $_FILES['photo']['name']);
      echo 'OK';
    } else {
         echo 'Not an image file!';
    }
}
...