Перед тем как добавить открытую загрузку файлов на сайт необходимо продумать какие типы файлов мы разрешаем загружать. Например, только изображения с раширениями - .jpg, .png,

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

Пример:

 
<?php
/* Создаем паттерн, где есть список запрещенных файлов по расширению */
$blacklist = '/.(com|bat|exe|cmd|vbs|msi|jar|php(\d?)|phtml|access|js)$/i';
/* Если файл содержит запрещенное разрешение - выход с уведомлением*/
if (preg_match($pattern, $_FILES['file']['name'])) 
{
   exit ("Файл с данным расширением запрещен к загрузке");
}
 
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
 
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) 
{
   echo "Файл загружен.\n";
 } 
else 
{
   echo "Файл не загружен.\n";
}
?>

Далее, если все-таки необходимо загружать файлы php, то можно, как вариант - менять их раширение на .txt

 
<?php
  // Обработчик формы загрузки
  if(!empty($_FILES['filename']['tmp_name']))
  {
    // Извлекаем расширение
    $ext = strtolower(strrchr($_FILES['filename']['name'], "."));
    // Запрещенные форматы
    $extentions = array(".phtml", ".php", ".html", ".htm", ".pl",
                        ".xml", ".inc");
    // Проверка расширения по
    // списоку запрещенных файлов
    if(in_array($ext, $extentions))
    {
      $pos = strrpos($_FILES['filename']['name'], ".");
      $path = substr($_FILES['filename']['name'], 0, $pos).".txt";
    }
    else
    {
      $path = $_FILES['filename']['name'];
    }
    // Сохраняем файл в текущем каталоге
    if(copy($_FILES['filename']['tmp_name'], $path))
    {
      echo "Файл успешно загружен - <a href=$path>$path</a>";
    }
  }
?>

Также можно при помощи .htaccess папки, в которую загружаются файлы переопределить обработчик исполняемых файлов php, perl воспринимать их как текстовые:

RemoveHandler .php .phtml .pl
AddType text/plain .php .phtml .pl

Еще можно в папке прописать запрет на исполнение скриптов:

Options -ExecCGI
AddHandler cgi-script .pl .py .php .jsp. htm .shtml .sh .asp .cgi



3 комментариев к “Скрипт загрузки файлов PHP – уязвимость”

  • Спасибо, помогло защититься. Раньше была уязвимость, теперь после установки правильного htaccess все отлично стало

  • Кат :

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

  • Сергей :

    Тупо проверять размер файла, если больше положенного - запрет.

Оставить комментарий

Подписка по e-mail и RSS
rss

Подписаться по e-mail:

Поиск
Категории