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

Форум PHP

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

 

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

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

тема: Проверка загружаемого файла
 
 автор: TetRiska   (29.11.2010 в 14:30)   письмо автору
 
 

Всем привет, вот собрал все известные мне методы проверок загрузки файлов на сервер. Хотел бы узнать стоит ли их использовать все вместе для большей надежности от заливки эксплойта. Может я что-то еще не учел? Жду критики и пожеланий. Как вообще по максимуму защитится? Спасибо.

$error = 0;
$file = $_FILES['foto']['type'];
$file_type = substr($file, 0, 5);
$image_type = mime_content_type($file);
$allowed_files = array("image/gif", "image/png", "image/jpeg", "image/pjpeg"); 

//1-я проверка
if($file_type != "image"){
    $error++;
}
//2-я проверка
if (!in_array($file, $allowed_files){
    $error++;
}
//3-я проверка
if (!in_array($image_type, $allowed_files){
    $error++;
}

if($error == 0){
    echo "Загружаем файл";
}

П.С. В догонку хочу спросить какой mime тип файлов .doc, .exel, .pdf. Заранее спасибо.

  Ответить  
 
 автор: neadekvat   (29.11.2010 в 14:54)   письмо автору
 
   для: TetRiska   (29.11.2010 в 14:30)
 

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

<?php
/* upload_pic(string src, string dest [, int quality[, string filename]])
   string src - путь до изображения,
   string dest - путь для сохраняния (БЕЗ имени файла)
   quality - качество сжатия
   filename - имя файла
  */
  
  
function upload_pic($src$dest$quality 75$filename null) {

    global 
$error;
    
    
$size getimagesize($src);
    if (
$size === false) {
       
// в квадратных скобках указываем порядковый номер ошибки,
чтобы понятьна каком этапе она вылезла
      $error
[] = 'Изображение имеет неизвестный формат[1]';
      return 
false;
    }
    
    if ( empty( 
$filename ) ) {
      
$filename substrmd5time() ), 012) . '.jpg'// генерируем новое имя файла
    
}
    
    
$dest rtrim($dest"/"); // удаляем слеш с конца
    
$dest .= '/' $filename// лепим окончательный адрес
   
    
$quality intval($quality);
    
    
$format strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
    
    if (
$format == 'bmp') {
      
$error[] = 'Изображение имеет недопустимый формат (.bmp)
  (Обработка файлов .bmp не поддерживается стандартными средствами PHP'
;
      return 
false;
    }
    
    
$icfunc "imagecreatefrom" $format;
    if (!
function_exists($icfunc)) {
      
$error[] = 'Изображение имеет неизвестный формат[2] ' $icfunc;
      return 
false;
    }
    
    
$isrc $icfunc($src);
    
$idest imagecreatetruecolor($size[0], $size[1]); 
    
imagefill($idest000xFFFFFF);
    
imagecopyresampled($idest$isrc0000$size[0], $size[1], $size[0], $size[1]);
    
imagejpeg($idest$dest$quality);
    
    
imagedestroy($isrc); 
    
imagedestroy($idest);
    
    return 
$filename;
  }
  

  Ответить  
 
 автор: TetRiska   (29.11.2010 в 16:03)   письмо автору
 
   для: neadekvat   (29.11.2010 в 14:54)
 

делать копию после того как картинка поместилась во временную папку $_FILES['foto']['name'] и от туда уже делаем копирование?
src - т.е. указываю путь к временной папке $_FILES['foto']['name']?

П.С. а как быть тогда с док, ексель и пдф? как их проверять, тут копирование не прокатит)

  Ответить  
 
 автор: neadekvat   (29.11.2010 в 16:13)   письмо автору
 
   для: TetRiska   (29.11.2010 в 16:03)
 

Нет, берете картинку из временной папки (доступна через _FILES), делайте из нее копию в памяти (imagecreatefrom*()) и затем сохраняете уже в постоянную папку.

С .doc, .xls, .pdf - не могу с ходу сказать, надо гуглить.

  Ответить  
 
 автор: TetRiska   (29.11.2010 в 16:20)   письмо автору
 
   для: neadekvat   (29.11.2010 в 16:13)
 

>Нет, берете картинку из временной папки (доступна через _FILES), делайте из нее копию в памяти (imagecreatefrom*()) и затем сохраняете уже в постоянную папку.
почему нет?:) после загрузки файла он помещается во временную, а от туда уже делаем копию в память, я так и писал :)

  Ответить  
 
 автор: neadekvat   (29.11.2010 в 16:23)   письмо автору
 
   для: TetRiska   (29.11.2010 в 16:20)
 

Вы два раза написали слова "копия", отчего я и подумал, что вы собрались лишний раз что-то куда-то копировать

  Ответить  
 
 автор: TetRiska   (29.11.2010 в 16:27)   письмо автору
 
   для: neadekvat   (29.11.2010 в 16:23)
 

ясно, намудрил с выражением))

  Ответить  
 
 автор: TetRiska   (29.11.2010 в 17:08)   письмо автору
 
   для: neadekvat   (29.11.2010 в 14:54)
 

вернемся назад...

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

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

  Ответить  
 
 автор: neadekvat   (29.11.2010 в 17:11)   письмо автору
 
   для: TetRiska   (29.11.2010 в 17:08)
 

Интерпритатор подхватит? оО Насколько я знаю, изображение не будет открываться также, как открываете его вы на компьютере - оно будет побайтово считываться в память.

  Ответить  
 
 автор: TetRiska   (29.11.2010 в 17:21)   письмо автору
 
   для: neadekvat   (29.11.2010 в 17:11)
 

а разве не считается вместе вирус?

  Ответить  
 
 автор: neadekvat   (29.11.2010 в 17:23)   письмо автору
 
   для: TetRiska   (29.11.2010 в 17:21)
 

Только то, что является самим изображениям, все мета-данные и т.д. полетят мимо.

  Ответить  
 
 автор: TetRiska   (29.11.2010 в 17:35)   письмо автору
 
   для: neadekvat   (29.11.2010 в 17:23)
 

довольно интересно, есть кто такого же мнения?

  Ответить  
 
 автор: sim5   (29.11.2010 в 18:04)   письмо автору
 
   для: TetRiska   (29.11.2010 в 17:35)
 

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

  Ответить  
 
 автор: Slo_Nik   (29.11.2010 в 20:13)   письмо автору
 
   для: TetRiska   (29.11.2010 в 17:35)
 

[поправлено модератором]

  Ответить  
 
 автор: TetRiska   (30.11.2010 в 04:04)   письмо автору
 
   для: Slo_Nik   (29.11.2010 в 20:13)
 

спасибо

  Ответить  
 
 автор: TetRiska   (06.12.2010 в 17:22)   письмо автору
 
   для: TetRiska   (30.11.2010 в 04:04)
 

кстати, а если загружать на сервер файлы и изменять им атрибут на
1 - будут ли картинки открываться на сайте?
2 - исполнение скриптов загружаемых с этим атрибутов будет невозможным?

П.С. говорят что еще можно с помощью хтаксесса запретить выполнение скриптов, только не пойму что туда прописать нужно? и еще говорят, чтобы уберечь хтаксесс от перезаписи нужно выставить права лишь на чтение?

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

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