Вы должны предположить, что любые внешние данные испорчены и могут быть вредоносными. Пользователь может отключить JavaScript и отправить любой файл, который он хочет. Или пользователь может отправить файл на сервер и изменить тип и / или расширение MIME для обхода проверок на сервере.
Лучше всего убедиться, что ваш сервер настроен на правильную обработку различных типов MIME, а не по умолчанию анализировать неизвестные типы файлов как PHP. Другими словами, не устанавливайте Apache для обработки чего-либо, кроме файлов .php как PHP, и не блокируйте файлы .php от загрузки вообще. Обработка загрузки файлов - в лучшем случае непростая ситуация с точки зрения безопасности. Я настоятельно рекомендую сохранить загрузки вне корневого каталога вашего документа, переименовать их в случайную строку, которая известна только вам (например, при загрузке сохранить случайное имя в базе данных), а затем отправить файл через PHP в браузер.
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($filename));
header('Content-Transfer-Encoding: binary');
readfile($filename);
Я рекомендую сделать это, потому что хранение их вне корня документа препятствует доступу, использование уникального имени файла не позволяет кому-либо напрямую получить к нему доступ, а принудительная загрузка (должна) предотвращает любое автоматическое выполнение вредоносного файла, так что, надеюсь, антивирус пользователя мог бы найти его ...