Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Безопасен ли такой способ загрузки изображений
 
 автор: Ванек2010   (07.05.2012 в 12:46)   письмо автору
 
 

Пересмотрел несколько готовых решений загрузки файлов, интересует только изображений.
Имя изображения и путь будет известно пользователю.
В плане защиты меня смущает 2 момента:
1. прочитанный на хабре, про то, что хацкер может вставить произвольный код в конец изображения через текстовый редактор.
2. Обязательно ли сохранять загруженное изображение с расширением, которое возвращает функция getimagesize()?
А да, еще забыл добавить, в каталоге, где будут храниться изображения добавлю в .htaccess запрет на выполнение php кода.
Вот сам код, соответствует ли он всем критериям защиты?


<?php

/**   
 * Function of uploaded of a file    
 * Функция загрузки файла (аплоадер)   
 * @param  int    $max_file_size    максимальный размер файла в килобайтах   
 * @param  array  $valid_extensions массив допустимых расширений   
 * @param  string $upload_dir       директория загрузки   
 * @return array                    сообщение о ходе выполнения   
 *   
 * @author IT studio IRBIS-team (www.irbis-team.com)   
 * @copyright © 2009 IRBIS-team    
 */   
    
function uploadHandle($max_file_size 100$valid_extensions = array(), $upload_dir '.')   
    {   
       
        
$error NULL;   
        
$info  NULL;   
        
$max_file_size *= 1024;   

        if (
$_FILES['userfile']['error'] === UPLOAD_ERR_OK)   
        {   
            
# проверяем расширение файла   
            
$file_extension strtolower(pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION));   
            if (
in_array($file_extension$valid_extensions))   
            {   
                
# проверяем размер файла   
                
if ($_FILES['userfile']['size'] < $max_file_size)   
                {   
                    
                    
# проверяем, действительно ли загруженный файл является изображением
                      
$imageinfo getimagesize($_FILES["userfile"]["tmp_name"]);
                        
                      if (
$imageinfo["mime"] == "image/gif" or $imageinfo["mime"] == "image/jpeg" or $imageinfo["mime"] == "image/png")
                    {                        
                        
# проверяем ширину и высоту баннера
                        
if ($imageinfo[0] == 468 and $imageinfo[1] == 60)
                        {
                            
$destination $upload_dir.'/myname.jpg';   
       
                            if (
move_uploaded_file($_FILES['userfile']['tmp_name'], $destination))   
                                
$info 'Баннер успешно загружен';   
                            else   
                                
$error 'Не удалось загрузить баннер';
                        }
                        else 
                            
$error 'Баннер должен быть размером 468x60';                                                
                      }
                    else 
                        
$error 'Загруженный файл не является изображением';                                          
                }    
                else   
                    
$error 'Размер баннера больше допустимого';   
            }    
            else   
                
$error 'У файла недопустимое расширение';   
        }    
        else   
        {   
            
# массив ошибок   
            
$error_values = array(  

                
UPLOAD_ERR_INI_SIZE   => 'Размер файла больше разрешенного директивой upload_max_filesize в php.ini',   
                
UPLOAD_ERR_FORM_SIZE  => 'Размер файла превышает указанное значение в MAX_FILE_SIZE',                             
                
UPLOAD_ERR_PARTIAL    => 'Файл был загружен только частично',    
                
UPLOAD_ERR_NO_FILE    => 'Не был выбран файл для загрузки',    
                
UPLOAD_ERR_NO_TMP_DIR => 'Не найдена папка для временных файлов',    
                
UPLOAD_ERR_CANT_WRITE => 'Ошибка записи файла на диск'  

                                  
);   
       
            
$error_code $_FILES['userfile']['error'];   
       
            if (!empty(
$error_values[$error_code]))   
                
$error $error_values[$error_code];   
            else   
                
$error 'Не известная ошибка, сообщите о проблеме администраторам';   
        }   
       
        return array(
'info' => $info'error' => $error);   
    }   
       
       
       
       
##################################/       
    
$extensions = array('jpg''jpeg''png''gif');   
    
$upload_dir 'uploads';   
       
    
# Запускаем функцию   
    
if(!empty($_POST['upload_submit']))  
    {       
        
$message uploadHandle(100$extensions$upload_dir);   
     
        
# Выводим сообщение   
        
echo $message['error'] ? $message['error'] : $message['info'];   
    }  
?>   

<form action="" method="post" enctype="multipart/form-data">   
    <input type="file" name="userfile" />   
    <input type="submit" value="Закачать" name="upload_submit" />   
</form>

  Ответить  
 
 автор: Tamplier   (07.05.2012 в 14:54)   письмо автору
 
   для: Ванек2010   (07.05.2012 в 12:46)
 

По хорошему все загружаемые изображения нужно перерисовывать. Правда к GIF анимации это не применимо (по крайней мере средствами библиотеки GD). Иначе вам вместо графического файла могут подсунуть все что угодно, подменив часть параметров и расширение. При этом даже не суть важно может вирус работать или нет, но если поисковый робот найдет код вируса у вас на сайте, проблемы с поисковиком вам гарантированны.

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


P.S. Да вопрос к экспертам (пишу тут дабы не плодить одинаковых тем), возможно ли как-то проверить, что картинка это картинка белого цвета, без дополнительных оттенков?

  Ответить  
 
 автор: Ванек2010   (07.05.2012 в 15:05)   письмо автору
 
   для: Tamplier   (07.05.2012 в 14:54)
 

Gif анимация должна быть, поэтому перерисовка не подходит. Как быть в этом случае?

  Ответить  
 
 автор: confirm   (07.05.2012 в 15:24)   письмо автору
 
   для: Ванек2010   (07.05.2012 в 15:05)
 

Есть классы работающие с gif анимацией. Что касается остального, то:
<?
$im 
file_get_contents($_FILES['img']['tmp_name'];
If(
$im imagecreatefromstring($im)) {
  
//imagejpeg($im) или imagepng($im) для сохранения
}

  Ответить  
 
 автор: Ванек2010   (07.05.2012 в 17:59)   письмо автору
 
   для: confirm   (07.05.2012 в 15:24)
 

Какие классы можешь посоветовать кроме ImageMagick (не понял как установить ее на юникс) и http://forssto.com/gifexample/ он не правильно ресайзит почему-то.

  Ответить  
 
 автор: confirm   (08.05.2012 в 05:20)   письмо автору
 
   для: Ванек2010   (07.05.2012 в 17:59)
 

ImageMagick - это не класс, а библиотека. Если еще нечто подобное не знаю, не интересовался, как впрочем самим ImageMagick.

  Ответить  
 
 автор: confirm   (07.05.2012 в 15:19)   письмо автору
 
   для: Tamplier   (07.05.2012 в 14:54)
 

А что такое картинка белого цвета?

  Ответить  
 
 автор: Tamplier   (07.05.2012 в 15:22)   письмо автору
 
   для: confirm   (07.05.2012 в 15:19)
 

Просто изображение только белого цвета, чистый белый лист.
Иногда получается если вместо картинки подсунуть что-то другое )))
Тупо картинка где присутствует только один цвет - белый

  Ответить  
 
 автор: confirm   (07.05.2012 в 15:27)   письмо автору
 
   для: Tamplier   (07.05.2012 в 15:22)
 

Понятно. Проверить не так сложно, если это изображение на палитре. Если нет, то преобразовать в такое. А дальше прочесть палитру.

  Ответить  
 
 автор: Tamplier   (07.05.2012 в 15:47)   письмо автору
 
   для: confirm   (07.05.2012 в 15:27)
 

Прочесть палитру...?
пример сбросьте

  Ответить  
 
 автор: confirm   (07.05.2012 в 16:09)   письмо автору
 
   для: Tamplier   (07.05.2012 в 15:47)
 

http://www.sql.ru/forum/actualthread.aspx?tid=675954

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования