Каков наиболее безопасный метод загрузки php-файлов, который может обрабатывать все типы файлов?

1

Я пытаюсь разработать небольшую социальную сеть и хотел бы знать, достаточно ли такого подхода, чтобы сделать мой "сценарий обработки загрузки файлов" максимально безопасным. Я хочу, чтобы мои пользователи загружали изображения [jpeg, jpg, png, gif], видео [3gp, wma, mp4] и mp3 файлы. Я рассмотрел многие вопросы здесь, в SO, но большинство из них, похоже, имеют дело с загрузкой изображений в деталях, а не с видео и mp3. Я хотел бы знать, что еще я могу сделать, чтобы сделать скрипт доступным для загрузки скриптом msot. [да, я довольно параноидальный об обеспечении безопасности и определенно хочу, чтобы мой сайт был известен своей безопасностью, а не скоростью]. Мой нынешний подход выглядит следующим образом:

  • проверьте, зарегистрирован ли пользователь (путем проверки сеанса)
  • проверить, загружен ли файл без ошибок
  • проверьте, находится ли размер файла в допустимом диапазоне
  • дезинфицировать имя файла
  • получить расширение файла и проверить, разрешено ли это расширение
  • получить тип mime и проверить, является ли он допустимым типом mime
  • генерировать новое случайное имя файла
  • установить правила.htaccess для папки вне public_html и использовать ее для хранения загруженных файлов
  • используйте move_uploaded_file()
  • используйте chmod(), чтобы установить '0644' в качестве разрешения для загруженного файла

В файле.htaccess будут добавлены:

 SetHandler none
    SetHandler default-handler
    Options -ExecCGI
    php_flag engine off

ForceType application/octet-stream
<FilesMatch "(?i)\.jpe?g$">
    ForceType image/jpeg
</FilesMatch>
<FilesMatch "(?i)\.gif$">
    ForceType image/gif
</FilesMatch>
<FilesMatch "(?i)\.png$">
    ForceType image/png
</FilesMatch>
<FilesMatch "(?i)\.mp3$">
    ForceType audio/mpeg
</FilesMatch>
<FilesMatch "(?i)\.mp4$">
    ForceType video/mp4
</FilesMatch>

Код, который я пытаюсь сделать, выглядит следующим образом:

$fileInput = $_FILES['image'];
$sizeLimit="4000";
if($fileInput['error'] === UPLOAD_ERR_OK && isset($fileInput['tmp_name'])){
if($fileInput['size'] < $sizeLimit){
$cleanedName=stripslashes($fileInput['name']); //cleaning file name
$checking = pathinfo($cleanedName); //finding extension
$ext=$checking['extension'];
$finfo = finfo_open(FILEINFO_MIME_TYPE); // find mime type
$mimetype =  finfo_file($finfo, $fileInput['tmp_name']);
finfo_close($finfo);
.
.
.//generate random name and use move_uploaded_file() and chmod()
}
}

Является ли этот подход достаточным для обеспечения безопасности моего сайта или существуют некоторые серьезные изъяны в этом методе?. Заранее спасибо за вашу помощь.

  • 0
    Если вы хотите быть более безопасным, убедитесь, что у вас есть SSL. Что касается самих загрузок, файл - это просто файл независимо от его типа, а файлы большего размера или файлы определенного типа не являются более жесткими или менее безопасными сами по себе.
  • 0
    @GolezTrol Спасибо. Да, я обязательно буду использовать SSL. Я заметил, что большинство пользователей SO в основном предлагают использовать GD, чтобы проверить, является ли загрузка изображением, но есть ли такой способ проверки для видео и аудио, чтобы быть более уверенными в файлах? Оставляет ли мой подход какие-либо зияющие лазейки, которыми можно легко манипулировать?
Теги:
security
file-upload

1 ответ

0
Лучший ответ

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

Что вы до сих пор хорошо, мои дополнительные советы:

  • Virus scan all uploads - это больше для защиты других пользователей вашего приложения, а не от вашего сервера.
  • Храните изображения за пределами корня веб-сайта полностью и используйте такой подход, чтобы проксировать файлы, которые будут обслуживаться. Это имеет то преимущество, что любые дополнительные проверки разрешений могут выполняться в коде (так что Боб не может загружать файлы Алисы), и поскольку к файлам обращаются как данные, нет никаких шансов на выполнение.
  • Подавать файлы с помощью X-Content-Type-Options: nosniff заголовок X-Content-Type-Options: nosniff для предотвращения любых атак XSS через IE mime sniffing.
  • Храните изображения с использованием имен, сгенерированных сервером. Например, вы можете назвать каждый файл после первичного ключа своей записи в базе данных. Это смягчит любые атаки обхода каталога (например, этот), и если пользователю удастся загрузить что-то вредоносное, они с меньшей вероятностью найдут его на сервере.
  • Загрузите все изображения в библиотеку изображений и сохраните их, чтобы убедиться, что у них нет эксплойтов, встроенных для популярных браузеров.
  • У вас есть какая-то ручная система контроля, чтобы следить за любым загруженным незаконным контентом.
  • Защитите свою форму от CSRF.
  • 0
    Большое спасибо за замечательные советы. Я планирую использовать clamAv для сканирования файлов. Я надеюсь, что токенов csrf на основе сеанса будет достаточно для предотвращения любых угроз csrf.
  • 0
    Да, сессионные токены CSRF - путь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню