Имя файла для загрузки данных не указано имя файла для загрузки
Обновлено: 21.11.2024
Практически во всем мире считается, что загрузка файлов является одной из самых больших поверхностей для атак в веб-безопасности, допуская такое огромное разнообразие атак, но при этом ее довольно сложно защитить.
В следующем сообщении приведены некоторые советы и приемы, которые мы используем в OnSecurity при тестировании этих функций.
Обратите внимание, что это не включает все проверки, которые должны быть выполнены, например, контекстно-зависимые уязвимости.
Контрольный список безопасности
Отражаются ли имена файлов на странице? Если да, то закодированы ли они в HTML Entity (XSS через имена файлов)?
Принимает ли он ZIP-файлы? Попробуйте ZipSlip
Если он обрабатывает изображение, проверьте Image Tragick (CVE-2016-3714)
Можно ли обойти ограничения типа файла, изменив значение типа содержимого?
Можно ли обойти ограничения типов файлов, подделав действительные магические байты?
Можно ли загрузить файл с менее распространенным расширением (например, .phtml)?
Попробуйте поиграть с именем файла в запросе, потенциальным вектором обхода или SQL-инъекцией.
Проверьте, принимаются ли двойные расширения для загружаемых файлов.
Сервер Windows? Попробуйте добавить трейлинг. чтобы обойти черные списки расширений, эта точка будет автоматически удалена операционной системой.
Можете ли вы загрузить SVG для XSS?
Если веб-сервер поддерживает, можете ли вы загружать файлы .htaccess?
Обрабатывает ли серверная часть изображение с помощью библиотеки PHP GD?
Уязвимо ли приложение для печально известного эксплойта ffmpeg?
Можно ли разработать собственные полиглоты для обхода определенных фильтров?
Передает ли приложение имя файла какой-либо системной функции? Если да, то можете ли вы добиться RCE с помощью внедрения кода в имя файла?
Запускает ли приложение загруженный файл через exiftool? Если да, то можно ли получить RCE с помощью эксплойта djvu?
Можно ли обойти фильтры расширений, используя разные заглавные буквы?
RCE через параметр имени файла
Если приложение включает обработку пользовательских изображений/манипулирование файлами, оно может быть уязвимо для удаленного выполнения команд посредством внедрения кода в имя файла.
Некоторые примеры допустимых имен файлов, которые могут вызвать внедрение команды, следующие:
Имя файла | Полезная нагрузка | Результат при уязвимости |
---|---|---|
a$(whoami)z.jpg | $(whoami) | a[ТЕКУЩИЙ ПОЛЬЗОВАТЕЛЬ]z.jpg |
a`whoami`z.jpg | `whoami` | a[ТЕКУЩИЙ ПОЛЬЗОВАТЕЛЬ]z.jpg |
a;спать 30;z.jpg | ;sleep 30; | Приложению потребуется 30+ секунд, чтобы ответить |
Пример уязвимого кода
RCE через эксплойт ExifTool
Exiftool версий с 7.44 по 12.23 включительно подвержен уязвимости локального выполнения команд при обработке файлов djvu. Зная это, если веб-приложение принимает загруженные файлы, которые затем передаются в exiftool, это может, в свою очередь, привести к RCE (см. пример в ссылке).
Пример эксплойта можно увидеть ниже, где «sample1.djvu» — это случайный образец файла, который я нашел в Интернете.
Ссылки
Обход фильтров с помощью расширений с учетом регистра.
В зависимости от того, как закодирована серверная часть приложения, это может позволить злоумышленнику обойти определенные проверки, просто изменив заглавные буквы в расширении файла.
Например: shell.php станет shell.pHP
Примеры этого можно найти в ссылках ниже.
Ссылки
Магическая подделка байтов
Если приложение использует магические байты файла для определения типа содержимого, например, с помощью функции PHP mime_content_type, мы можем легко обойти меры безопасности, подделав магические байты разрешенного файла. Например, если изображения GIF разрешены, мы можем подделать волшебные байты изображения GIF GIF89a, чтобы сервер думал, что мы отправляем ему действительный GIF, как показано ниже.
Это также можно наблюдать с помощью команды файла GNU.
Общие полезные магические байты
Тип файла | Magic Bytes |
---|---|
GIF | GIF89a ;\x0a |
%PDF- | |
JPG / JPEG | < td>\xFF\xD8\xFF\xDB|
PNG | \x89\x50\x4E\x47\x0D\x0A\x1A\x0A td> |
TAR | \x75\x73\x74\x61\x72\x00\x30\x30 |
XML |
Обход библиотеки PHP GD
Распространенная ошибка разработчиков заключается в том, что они думают, что библиотека обработки изображений PHP GD помогает защититься от загрузки вредоносных файлов, поскольку после обработки и сжатия изображения его структура изменяется и зашифровывает любой ранее действующий код.
Однако это заблуждение приводит к серьезной бреши в системе безопасности и поверхности атаки, если злоумышленнику известна следующая техника.
По сути, чтобы использовать эту уязвимость в системе безопасности, нам нужно найти часть изображения, которая является одинаковой как до сжатия, так и после сжатия. Как видно из исследований, ссылки на которые приведены в ссылках.
Вы можете легко определить, передается ли изображение через библиотеку PHP GD, загрузив изображение, загрузив указанное изображение обратно с веб-сервера, или прочитав файл как текст. Если он был сжат с помощью PHP-библиотеки GD, скорее всего, он будет содержать следующую информацию в заголовке или, по крайней мере, что-то подобное:
Обратите внимание, что если вы обнаружите, что PHP GD используется с пользовательским значением «глубины», это значительно усложнит использование, а в некоторых случаях сделает его невозможным, например, когда обработанное изображение содержит следующий заголовок:< /p>
Ссылки
Загрузка файла .htaccess
Синие сотрудники и разработчики обычно быстро заносят расширения файлов в черный список, но редко задумываются о том, как могут быть использованы сами файлы конфигурации веб-сервера. Вот почему метод .htaccess может быть настолько опасен, что может привести даже к RCE.
Этот файл не является вектором RCE напрямую, но он позволяет определять новые допустимые расширения PHP, которые затем можно загрузить на сервер (поскольку они не занесены в черный список).
Пример файла .htaccess, который можно использовать для добавления нового расширения PHP:
Обратите внимание, что эта атака основана на включении следующих параметров, а NGINX не поддерживает файлы .htaccess.
Ресурсы
Загрузить вредоносный файл SVG для XSS
Когда приложения позволяют загружать изображения, может показаться логичным внести файлы SVG в белый список вместе с другими распространенными типами изображений, хотя файлы SVG можно использовать для достижения XSS в приложении, просто загрузив следующее содержимое в файл .svg. файл. Этой техникой обычно злоупотребляют охотники за жуками в дикой природе.
Злоупотребление ADS для обхода черных списков расширений
Согласно проекту безопасности веб-приложений с открытым исходным кодом (OWASP):
Еще один метод обхода черного списка расширений — использование альтернативного потока данных NTFS (ADS) в Windows. В этом случае после запрещенного расширения и перед разрешенным будет вставлено двоеточие «:». В результате на сервере будет создан пустой файл с запрещенным расширением (например, «file.asax:.jpg»). Этот файл может быть отредактирован позже с использованием других методов, таких как использование его короткого имени. Шаблон «::$data» также можно использовать для создания непустых файлов. Поэтому добавление символа точки после этого шаблона также может быть полезно для обхода дополнительных ограничений (например, «file.asp::$data».)
Ссылки
В конце. в Windows
В Windows, когда файл создается с завершающей точкой, файл сохраняется БЕЗ упомянутого завершающего символа, что приводит к потенциальному обходу черного списка при загрузке файлов Windows.
Внедрение нулевого байта (\x00)
Чтобы понять суть этой атаки, нам нужно поверхностно изучить, что такое нулевой байт, для чего он нужен и как он работает.
Согласно Википедии:
Нулевой символ — это управляющий символ с нулевым значением. Он присутствует во многих наборах символов, в том числе в кодах Бодо и ITA2, ISO/IEC 646, управляющем коде C0, универсальном кодированном наборе символов и EBCDIC. Он доступен практически на всех основных языках программирования.
Для чего нужен нулевой байт?
Нулевой символ — это символ, у которого все биты равны нулю. Следовательно, он имеет нулевое числовое значение и может использоваться для представления конца строки символов, например слова или фразы. Это помогает программистам определять длину строк.
Как это можно использовать?
Как указывалось ранее, символ нулевого байта может использоваться для определения завершения строки. Это означает, что когда определенные интерпретаторы достигают нулевого байта в строке, они будут ожидать, что это будет конец строки, даже если после него есть символы. Это. Это приводит к целому ряду атак, основанных на путанице, таких как следующие.
Представьте, что приложение блокирует сохранение определенных расширений на сервере, но приложение принимает во внимание нулевые байты при проверке расширения, мы могли бы отправить что-то вроде строк shell.jpg%00.php .
Поскольку сервер проверит строку, но наткнется на нулевой байт, он будет считывать только до «.jpg» и передавать его как действительный, хотя файл будет сохранен на сервере как shell.jpg%00 .php, который затем доступен для выполнения команд.
Было обнаружено, что более старые версии PHP уязвимы для указанной атаки. Дополнительную информацию см. здесь
Загрузка файла Web.config
В веб-серверах IIS, если приложение позволяет загружать файлы с именем «web.config», вы можете проводить различные вредоносные атаки, включая XSS, RCE, загрузку произвольных файлов и многое другое.
Примеры вредоносных файлов web.config широко доступны в Интернете, хотя ниже я включил свой любимый из gazcbm на GitHub.
Ресурсы
Застежка-молния
Zip Slip — это уязвимость, обнаруженная исследовательской группой Snyk Security Research Team, которая существует, когда функция загрузки файлов принимает и извлекает zip-файлы без надлежащих мер безопасности. Эта уязвимость позволяет записывать пути за пределы предполагаемого каталога загрузки, а в некоторых случаях и RCE.
Уязвимость использует ZIP-файлы, которые могут содержать файлы со специально размещенными полезными данными, установленными в именах, которые после извлечения приводят к обходу пути и могут записывать любой файл в любой каталог, к которому у веб-сервера есть доступ.
Например, мы можем создать вредоносный файл zipslip с помощью приведенного ниже сценария, который затем содержит файл обхода пути. После перечисления файлов в zip:
Это ясно показывает, что ZIP-файл содержит «../../rce.php», который после извлечения выйдет из предполагаемого каталога уязвимого приложения.
Уязвимость обнаружена в различных популярных библиотеках и продуктах, таких как подключаемый модуль Fortify Cloud Scan Jenkins, набор инструментов AWS для Eclipse, Apache Maven и других. Полный список уязвимых библиотек/продуктов можно найти здесь.
Полезное видео для дальнейшего объяснения этой уязвимости можно найти на YouTube LiveOverflow.
Создать вредоносный файл Zip Slip:
Изображение Tragick CVE-2016-3714
Image Tragick — это печально известный эксплойт (CVE-2016-3714) в библиотеке обработки изображений ImageMagick PHP. Уязвимость заключалась в злоупотреблении неправильной обработкой кавычек, что приводило к уязвимости внедрения команд, как объяснялось на ранее упомянутом веб-сайте:
Где %M — фактическая ссылка из ввода. Можно передать значение как
И выполнить неожиданную команду «ls -la» (должны быть установлены wget или curl).
По сути, вредоносный файл может быть предоставлен для обработки и приведет к выполнению кода на машине, поэтому, если мы объединим эту уязвимость с функцией удаленной загрузки файла в приложении для обработки изображений, мы получим RCE.
Эта уязвимость была тщательно исследована, и в Интернете можно найти множество примеров эксплойтов.
Использование FFMPEG и объяснение
Такой же печально известный эксплойт можно найти в программном обеспечении FFMEG, который приводит к раскрытию локального файла. Эта уязвимость использовалась в дикой природе для достижения как LFR, так и SSRF. См. примеры для получения дополнительной информации.
Ах да, старая добрая проблема с загрузкой файлов. Основная идея загрузки файлов на самом деле довольно проста. В основном это работает следующим образом:
Тег помечается enctype=multipart/form-data и помещается в эту форму.
Приложение обращается к файлу из словаря файлов в объекте запроса.
используйте метод save() файла, чтобы навсегда сохранить файл где-нибудь в файловой системе.
Нежное введение¶
Начнем с самого простого приложения, которое загружает файл в определенную папку для загрузки и отображает файл пользователю. Давайте посмотрим на загрузочный код нашего приложения:
Итак, сначала нам нужно несколько импортов. Большинство должно быть простым, werkzeug.secure_filename() будет объяснено немного позже. UPLOAD_FOLDER — это место, где мы будем хранить загруженные файлы, а ALLOWED_EXTENSIONS — это набор разрешенных расширений файлов.
Почему мы ограничиваем разрешенные расширения? Вероятно, вы не хотите, чтобы ваши пользователи могли загружать все туда, если сервер напрямую отправляет данные клиенту. Таким образом вы можете убедиться, что пользователи не смогут загружать HTML-файлы, которые могут вызвать проблемы с XSS (см. Межсайтовый скриптинг (XSS)). Также не забудьте запретить файлы .php, если сервер их выполняет, но у кого на сервере установлен PHP, верно? :)
Далее функции, которые проверяют допустимость расширения, загружают файл и перенаправляют пользователя на URL-адрес загруженного файла:
Так что же на самом деле делает эта функция secure_filename()? Теперь проблема в том, что существует такой принцип, который называется «никогда не доверять пользовательскому вводу». Это также верно для имени загруженного файла. Все отправленные данные формы могут быть подделаны, а имена файлов могут быть опасны. На данный момент просто запомните: всегда используйте эту функцию для защиты имени файла перед его сохранением непосредственно в файловой системе.
Информация для профессионалов
Итак, вас интересует, что делает эта функция secure_filename() и в чем проблема, если вы ее не используете? Просто представьте, что кто-то отправит вашему приложению следующую информацию в качестве имени файла:
Предполагая, что число ../ правильное, и вы соедините это с UPLOAD_FOLDER, пользователь может иметь возможность изменять файл в файловой системе сервера, который он или она не должен изменять. Это требует некоторых знаний о том, как выглядит приложение, но поверьте мне, хакеры терпеливы :)
Теперь давайте посмотрим, как работает эта функция:
Мы хотим, чтобы загруженные файлы могли быть загружены пользователями. Мы определим представление download_file для обслуживания файлов в папке загрузки по имени. url_for("download_file", name=name) создает URL для скачивания.
Улучшение загрузки¶
Новое в версии 0.6.
Как именно Flask обрабатывает загрузки? Ну, он будет хранить их в памяти веб-сервера, если файлы достаточно малы, в противном случае во временном расположении (как возвращается tempfile.gettempdir()). Но как указать максимальный размер файла, после которого загрузка прерывается? По умолчанию Flask с радостью примет загрузку файлов с неограниченным объемом памяти, но вы можете ограничить это, установив ключ конфигурации MAX_CONTENT_LENGTH:
Приведенный выше код ограничивает максимально допустимую полезную нагрузку до 16 МБ. Если передается файл большего размера, Flask вызовет исключение RequestEntityTooLarge.
Проблема со сбросом соединения
При использовании локального сервера разработки вы можете получить сообщение об ошибке сброса соединения вместо ответа 413. Вы получите правильный ответ о статусе при запуске приложения с рабочим сервером WSGI.
Эта функция была добавлена в Flask 0.6, но ее можно реализовать и в более старых версиях путем создания подкласса объекта запроса. Для получения дополнительной информации об этом обратитесь к документации Werkzeug по работе с файлами.
Загрузить индикаторы выполнения¶
Некоторое время назад многим разработчикам пришла в голову идея читать входящий файл небольшими порциями и сохранять ход загрузки в базе данных, чтобы иметь возможность опросить ход выполнения с помощью JavaScript от клиента. Клиент каждые 5 секунд спрашивает у сервера, сколько он передал, но это то, что он уже должен знать.
Простое решение¶
Теперь есть лучшие решения, которые работают быстрее и надежнее. Существуют библиотеки JavaScript, такие как jQuery, которые имеют плагины форм, упрощающие создание индикатора выполнения.
Поскольку общий шаблон для загрузки файлов существует почти без изменений во всех приложениях, связанных с загрузкой, существуют также некоторые расширения Flask, которые реализуют полноценный механизм загрузки, позволяющий контролировать, какие расширения файлов разрешено загружать.
Вот несколько важных рекомендаций, которые следует учитывать при форматировании загружаемого файла с помощью Экрана данных вручную (MDS) или Загрузка данных — Проекты экраны в Утилитах.
- Формат файла должен соответствовать формату с разделителями табуляцией в шаблоне, который доступен для загрузки. Включение заголовков столбцов необязательно. Однако они должны совпадать с указанными в шаблоне. Допускается только одна строка заголовка. ол>
- Формат шаблона с разделителями табуляцией включает следующие обязательные столбцы: идентификатор приложения, название категории, IC финансирования и сумма в долларах. Столбец CAN обязателен при загрузке с экрана MDS, но необязателен на экране Загрузка данных - Проекты. Ваша загрузка не будет выполнена, если вы не включите обязательные столбцы. ол>
- Для подпроектов требуется уникальный идентификатор приложения. Система не разрешает использовать идентификатор родительского приложения подпроекта. ол>
- Вы можете загрузить все категории в один файл или каждую категорию в отдельный файл.
- Не используйте данные PUB в файле данных. RCDC использует текущие данные, а использование данных PUB может привести к ошибкам проверки.
- В меню "Файл" выберите "Открыть проект".
- В диалоговом окне «Открыть проект» перейдите к:
- Выберите папку fileupload.
- Установите флажок "Открыть как основной проект".
- Нажмите "Открыть проект".
- На вкладке "Проекты" щелкните правой кнопкой мыши загрузить файл и выберите "Развернуть".
- В окне терминала перейдите по ссылке:
- Введите следующую команду:
- Введите следующую команду:
- В веб-браузере введите следующий URL-адрес:
- Если выбрано несколько файлов, строка представляет первый выбранный файл. JavaScript может получить доступ к другим файлам через свойство файлов входных данных.
- Если файл еще не выбран, строка "" (пустая).
- Строка имеет префикс C:\fakepath\ , чтобы вредоносное ПО не могло угадать файловую структуру пользователя.
- Действительное расширение имени файла без учета регистра, начинающееся с точки (""."). Например: .jpg , .pdf или .doc .
- Действительная строка типа MIME без расширений.
- Строка audio/* означает "любой аудиофайл".
- Строка video/* означает "любой видеофайл".
- Строка image/* означает "любой файл изображения".
Если вы загружаете все категории в один файл, используйте следующий формат имени файла:
Если вы загружаете все данные за 2014 финансовый год для NIAID, ваше имя файла будет AI_2014_dataload.txt.
Если вы загружаете каждую категорию в один файл, используйте следующий формат имени файла:
Если вы загружаете все данные за 2014 финансовый год для NIAID, ваше имя файла будет AI_2014_Immunization_dataload.txt.
Проверить условия и сообщения об ошибках для экрана данных вручную
У вас возникли проблемы с RCDC? Служба поддержки eRA/IMPACII всегда готова помочь. Пожалуйста, посетите справочную службу eRA/IMPACII, чтобы отправить запрос в службу поддержки.
Была ли эта информация полезной? Есть ли у вас какие-либо комментарии или предложения по поводу информации, представленной в этой теме? Отправьте свои комментарии об онлайн-справке RCDC в отдел коммуникаций eRA.
Пример fileupload показывает, как реализовать и использовать функцию загрузки файлов.
Кейс Duke’s Forest представляет собой более сложный пример загрузки файла изображения и сохранения его содержимого в базе данных.
Архитектура примера приложения fileupload
Пример приложения fileupload состоит из одного сервлета и HTML-формы, которая отправляет запрос на загрузку файла сервлету.
Этот пример включает очень простую HTML-форму с двумя полями: "Файл" и "Назначение". Тип ввода file позволяет пользователю просматривать локальную файловую систему для выбора файла. Когда файл выбран, он отправляется на сервер как часть запроса POST. При этом к форме с типом ввода файл применяются два обязательных ограничения:
Атрибуту enctype должно быть присвоено значение multipart/form-data.
Его метод должен быть POST.
Если форма указана таким образом, весь запрос отправляется на сервер в закодированном виде. Затем сервлет обрабатывает запрос на обработку входящих данных файла и извлечение файла из потока. Место назначения — это путь к месту, где файл будет сохранен на вашем компьютере. Нажатие кнопки «Загрузить» в нижней части формы отправляет данные в сервлет, который сохраняет файл в указанном месте назначения.
Форма HTML в tut-install/examples/web/fileupload/web/index.html выглядит следующим образом:
Метод запроса POST используется, когда клиенту необходимо отправить данные на сервер как часть запроса, например, при загрузке файла или отправке заполненной формы. Напротив, метод запроса GET отправляет URL-адрес и заголовки только на сервер, тогда как запросы POST также включают тело сообщения. Это позволяет отправлять на сервер данные произвольной длины любого типа. Поле заголовка в POST-запросе обычно указывает тип интернет-носителя тела сообщения.
При отправке формы браузер передает содержимое, объединяя все части, причем каждая часть представляет собой поле формы. Части названы в честь элементов input и отделены друг от друга строковыми разделителями с именем boundary.
Вот как выглядят отправленные данные из формы fileupload после выбора sample.txt в качестве файла, который будет загружен в tmp каталог в локальной файловой системе:
Сервлет FileUploadServlet.java можно найти в папке tut-install/examples/web/fileupload/src/java/fileupload/. каталог. Сервлет начинается следующим образом:
Аннотация @WebServlet использует свойство urlPatterns для определения сопоставлений сервлетов.
Аннотация @MultipartConfig указывает, что сервлет ожидает выполнения запросов с использованием типа MIME multipart/form-data.
Метод processRequest извлекает место назначения и часть файла из запроса, затем вызывает метод getFileName для получения имени файла из части файла. Затем метод создает FileOutputStream и копирует файл в указанное место назначения. Раздел обработки ошибок метода перехватывает и обрабатывает некоторые из наиболее распространенных причин, по которым файл не может быть найден. Методы processRequest и getFileName выглядят следующим образом:
Выполнение примера загрузки файла
Вы можете использовать IDE NetBeans или Ant для сборки, упаковки, развертывания и запуска примера fileupload.
Сборка, упаковка и развертывание примера fileupload с использованием среды IDE NetBeans
Сборка, упаковка и развертывание примера fileupload с использованием Ant
Запуск примера fileupload
Откроется страница загрузки файла.
Имя выбранного файла отображается в поле «Файл». Если вы не выберете файл, будет выдано исключение.
Каталог должен быть уже создан и доступен для записи. Если вы не введете имя каталога или введете имя несуществующего или защищенного каталога, будет выдано исключение.
Появится сообщение о том, что файл был создан в указанном вами каталоге.
Авторские права © 2013, Oracle и/или ее дочерние компании. Все права защищены. Официальные уведомления
Атрибут value входного файла содержит DOMString, представляющий путь к выбранным файлам. Если пользователь выбрал несколько файлов, значение представляет первый файл в списке выбранных файлов. Другие файлы можно идентифицировать с помощью свойства HTMLInputElement.files входных данных.
Примечание:
Дополнительные атрибуты
принять
Значение атрибута accept представляет собой строку, определяющую типы файлов, которые должен принимать входной файл. Эта строка представляет собой список разделенных запятыми уникальных описателей типов файлов. Поскольку данный тип файла может быть идентифицирован более чем одним способом, полезно предоставить полный набор спецификаторов типа, когда вам нужны файлы определенного формата.
Например, существует несколько способов идентификации файлов Microsoft Word, поэтому сайт, принимающий файлы Word, может использовать такой способ:
снять
Значение атрибута захвата — это строка, указывающая, какую камеру использовать для захвата изображения или видеоданных, если атрибут accept указывает, что ввод должен быть одного из этих типов. Значение user указывает, что следует использовать обращенную к пользователю камеру и/или микрофон. Значение environment указывает, что следует использовать обращенную наружу камеру и/или микрофон. Если этот атрибут отсутствует, пользовательский агент может сам решать, что делать. Если запрошенный режим просмотра недоступен, пользовательский агент может вернуться к своему предпочтительному режиму по умолчанию.
Примечание: ранее захват был логическим атрибутом, который, если он присутствовал, запрашивал использование устройств захвата мультимедиа, таких как камера или микрофон, вместо запроса ввода файла.
несколько
Если указан множественный логический атрибут, ввод файла позволяет пользователю выбрать более одного файла.
Нестандартные атрибуты
В дополнение к перечисленным выше атрибутам в некоторых браузерах доступны следующие нестандартные атрибуты. Вам следует стараться избегать их использования, когда это возможно, так как это ограничит способность вашего кода работать в браузерах, которые их не реализуют.
каталог вебкита
Атрибут boolean webkitdirectory, если он присутствует, указывает, что пользователю должны быть доступны только каталоги для выбора в интерфейсе средства выбора файлов. Дополнительную информацию и примеры см. в каталоге HTMLInputElement.webkit.
Хотя изначально webkitdirectory реализовано только для браузеров на основе WebKit, его также можно использовать в Microsoft Edge, а также в Firefox 50 и более поздних версиях. Однако, несмотря на то, что он имеет относительно широкую поддержку, он по-прежнему не является стандартным и не должен использоваться, если у вас нет альтернативы.
Спецификаторы уникальных типов файлов
Спецификатор уникального типа файла – это строка, описывающая тип файла, который может быть выбран пользователем в элементе типа файл . Каждый спецификатор уникального типа файла может принимать одну из следующих форм:
Атрибут accept принимает в качестве значения строку, содержащую один или несколько из этих уникальных спецификаторов типа файла, разделенных запятыми. Например, средство выбора файлов, которому требуется содержимое, которое может быть представлено в виде изображения, включая как стандартные форматы изображений, так и файлы PDF, может выглядеть следующим образом:
Читайте также: