2012-05-31 4 views
2

Я создаю небольшое веб-приложение, которое позволит зарегистрированному пользователю загружать фотографии продукта. Я пытаюсь построить-это-право, и после некоторых наивных реализаций в прошлом решил добавить все загруженные материалы в мою общую папку.Как обслуживать загруженные пользователем изображения?

\app (public folder) 
-\index.php 
\includes 
\config 
\uploads 

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

Это, как говорится, как я могу обслуживать эти фотографии на веб-странице? Каков наилучший способ сделать это? Раньше я использовал файл getImage.php, который использовал бы ID-параметр (и хэш некоторого сгенерированного значения, чтобы не допустить, чтобы пользователи просто угадали идентификаторы), которые выглядели бы как «getImage.php? Id = 555 & c = 44j54k3h5» , Сервер захватывает информацию об изображении в БД (реальный путь) и загружает содержимое, перестраивает заголовок и отправляет изображение.

Есть ли проблемы с безопасностью в отношении этого метода? Есть ли способ сделать его красивее? Будет ли правило перезаписи htaccess, которое ищет /images/imagename.jpg и отправит их в файл getImage.php, добавьте дыры безопасности? Любые рекомендации по передовым методам будут высоко оценены.

+0

Какие типы проверок безопасности вы делаете в файлах по мере их загрузки? –

+0

Ну, я еще не построил его, я хотел удостовериться, что сначала не заметил какой-то огромный шаг. Я буду проверять расширения и оттуда, чтобы убедиться, что они представляют собой изображение, ища их размеры, используя getimagesize(), поскольку это, кажется, обычный способ сделать это ... Этого достаточно? – Gazillion

+0

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

ответ

1

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

  • Как можно обрабатывать и защищать изображение/файл при загрузке? Каковы права на каталоги/файлы для загрузки?
  • Какие процессы имеют доступ к чтению и записи в эти места?
  • Какие типы обработчиков файлов у вас есть, которые могут выполнять произвольные файлы?
  • Если вы собираетесь в PHP-> get_image-> display_image маршрут, не пытается предотвратить злонамеренные ПОСЛЕ загрузки (на GetImage?)

Я хотел бы использовать Apache mod_alias для ссылки на каталог выше вебсервера. Таким образом, вы сможете по-прежнему использовать ссылки на изображения, не открывая полный каталог выше корня для воздействия.

+0

Спасибо, это все, что я рассмотрю. Я планировал добавить файл htaccess в папку uploads, которая отделяет от него все обработчики php (чтобы они не исполнялись), но все остальные вещи, которые я немного незнакомы :) – Gazillion

1

"симпатичнее" метод должен был бы использовать .htaccess перенаправлять

RewriteEngine On                                                         
RewriteBase/                              
RewriteRule ^getImage/([0-9]+)/(.+)\.png$ getImage.php?id=$1&c=$2 [NC,L] 

Тогда в getImage.php

if (isset($_GET['id']) && isset($_GET['c'])) { 

    // set headers 
    header("Content-Type: image/png"); 

    // cache control 
    header("Cache-Control: private, max-age=10800, pre-check=10800"); 
    header("Pragma: private"); 
    header("Expires: " . date(DATE_RFC822, strtotime("2 day"))); 
    if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { 
      header('Last-Modified: ' . $_SERVER['HTTP_IF_MODIFIED_SINCE'], true, 304);          
      exit;        
    } 

    /* do things */ 
    imagepng($image_resource); 
    imagedestroy($image_resource); 
} 
else { 

    echo "bad request"; 
} 

Таким образом, вместо

site.com/getImage.php?id=555&c=44j54k3h5 

Вы бы использовать

site.com/getImage/555/44j54k3h5.png 

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

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

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