Перед тем как добавить открытую загрузку файлов на сайт необходимо продумать какие типы файлов мы разрешаем загружать. Например, только изображения с раширениями - .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
Спасибо, помогло защититься. Раньше была уязвимость, теперь после установки правильного htaccess все отлично стало
Вопрос. А как лучше защититься от переполнения хостинга файлами, если злоумышленник начнет автоматически загружать большие файлы в большом количестве?
Тупо проверять размер файла, если больше положенного - запрет.