Intereting Posts
IMAP: PHP: как я могу получить и сохранить номер сообщения для удаления определенной почты Сценарий для удаления дубликатов из базы данных Mysqli update throwing Вызов функции-члена bind_param () Как создать дубликат элемента XML, но изменить имя элемента и удалить оригинал? Как проверить, не является ли текстовое поле пустым, а значение меньше 500 Неизвестный обработчик инструкции (0), заданный mysql_stmt_execute в PHP-коде Как заполнять данные формы из раскрывающегося списка? Как защищать паролем файлы (изображения, видео, zip) динамически от публики и разрешать доступ только к членам? Как я могу отделить javascript от PHP, когда JS нужна переменная PHP? Apache 2.22 + php 5.40 + Symfony2 Frameowrk = Ошибка сегментации Apache (11) Ограничение памяти PHP 25 МБ исчерпано – загрузка файлов / обрезка / изменение размера SQLSTATE Нарушение 1064 в SELECT Путь загрузки в Codeigniter возвращает «путь загрузки, кажется, недействителен» Преобразование ресурса сокета в сокет потока добавление переменной php в значение формы HTML

Должны ли мы дезинфицировать $ _FILES ?

После того как пользователь загрузит изображение на сервер, мы должны дезинфицировать $_FILES['filename']['name'] ?

Я проверяю размер файла / тип файла и т. Д. Но я не проверяю другие вещи. Есть ли потенциальная дыра в безопасности?

спасибо

Абсолютно! Поскольку @Bob уже упоминал, что для обычных имен файлов слишком просто перезаписываться.

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

Вот метод Upload() который я написал для PHP-структуры phunction :

 function Upload($source, $destination, $chmod = null) { $result = array(); $destination = self::Path($destination); if ((is_dir($destination) === true) && (array_key_exists($source, $_FILES) === true)) { if (count($_FILES[$source], COUNT_RECURSIVE) == 5) { foreach ($_FILES[$source] as $key => $value) { $_FILES[$source][$key] = array($value); } } foreach (array_map('basename', $_FILES[$source]['name']) as $key => $value) { $result[$value] = false; if ($_FILES[$source]['error'][$key] == UPLOAD_ERR_OK) { $file = ph()->Text->Slug($value, '_', '.'); if (file_exists($destination . $file) === true) { $file = substr_replace($file, '_' . md5_file($_FILES[$source]['tmp_name'][$key]), strrpos($value, '.'), 0); } if (move_uploaded_file($_FILES[$source]['tmp_name'][$key], $destination . $file) === true) { if (self::Chmod($destination . $file, $chmod) === true) { $result[$value] = $destination . $file; } } } } } return $result; } 

Важными частями являются:

  1. array_map('basename', ...) , это гарантирует, что файл не содержит относительных путей.
  2. ph()->Text->Slug() , это гарантирует, что в имени файла разрешены только .0-9a-zA-Z , все остальные символы заменяются .0-9a-zA-Z подчеркивания ( _ )
  3. md5_file() , это добавляется к имени файла, если еще один файл с тем же именем уже существует

Я предпочитаю использовать имя, предоставленное пользователем, так как поисковые системы могут использовать это, чтобы обеспечить лучшие результаты, но если это не важно для вас, простое microtime(true) или md5_file() может немного упростить ситуацию.

Надеюсь это поможет! знак равно

Имя файла – произвольная строка, предоставленная пользователем. Как правило, никогда не доверяйте произвольным пользовательским значениям.

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

вам также необходимо проверить наличие дубликатов имен. Слишком легко для нескольких людей загрузить изображение под названием «mycat.jpg», которое, если оно будет загружено в ту же папку, будет перезаписывать ранее загруженный файл с тем же именем. Вы можете сделать это, поместив уникальный идентификатор в имя файла (как предлагает Prix). Также убедитесь, что тип файла не просто заканчивается расширением изображения, но также является фактическим изображением; вы не хотите, чтобы ваш сервер работал слепым хостом для случайных файлов.