Параметр validateImageData и Image.FromStream ()

Меня беспокоит третий параметр в этой перегрузке, validateImageData. Документация мало что объясняет, в ней только говорится, что она вызывает проверку данных изображения, но без подробностей, что именно делается для проверки данных изображения?

public static Image FromStream (
    Stream stream,
    bool useEmbeddedColorManagement,
    bool validateImageData
)

Я хочу использовать это в веб-приложении, поэтому я хочу знать, что именно произойдет, если я установлю для validateImageData значение true, я хочу быть уверенным, что то, что загружает пользователь, является действительным изображением, рекомендуется ли установить для validateImageData значение true или достаточно поймать исключение, если оно выброшено? Кроме того, может ли установка validateImageData на true повлиять на производительность каким-либо образом? (пользователи могут загружать изображения размером до 250k)

Спасибо

Знаете ли вы, что можно использовать Reflector, чтобы увидеть, что делает код Framework?

Quibblesome 07.01.2009 17:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
1
4 481
4

Ответы 4

Почему бы просто не попробовать и не посмотреть, что произойдет с установленным, а не установленным флагом?

В любом случае вы должны обрабатывать любые исключения, которые могут возникнуть.

Я помню, как читал о некоторых проблемах с этим параметром. См. Сообщение это (оно довольно старое, но будьте осторожны).

Из Reflector мы видим:

if (validateImageData)
{
    num = SafeNativeMethods.Gdip.GdipImageForceValidation(new HandleRef(null, zero));
    if (num != 0)
    {
        SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(null, zero));
        throw SafeNativeMethods.Gdip.StatusException(num);
    }
}

Итак, мы видим, что вызывается GdipImageForceValidation (напомним, System.Drawing - это просто оболочка над GDI +). Документация для этой функции не очень хорошая:

This function forces validation of the image.

Не очень полезно. Однако суть сделана - файл изображения опрашивается, чтобы убедиться, что он безопасен для загрузки. Это может привести к загрузке всего изображения в память.

Если вы принимаете входные данные от пользователей, я бы определенно установил для этого флага значение true - вы никогда не знаете, какие файлы (искаженные или нет) пользователи будут загружать. Береженого Бог бережет. Вот почему по умолчанию используется true.

Также обратите внимание, что GDI + рекомендуется для серверных сред нет. Вам лучше использовать System.Windows.Media.Imaging.

Просматривая внутренний отражатель, вы увидите, что по умолчанию .NET всегда вызывает собственный API в библиотеках GDI + с именем GdipImageForceValidation (который передается путем передачи true для параметра validateImageData). Я не могу много узнать о родном API в MSDN, только это, который говорит нам не более чем имя самой функции. Однако похоже, что этот метод вызывает снижение производительности на основе Сообщение Джастина Роджера о загрузке изображений максимально быстрым способом через .NET. Также интуитивно понятно, что любой шаг «проверки» снизит производительность.

Однако, если вы укажете false для параметра validateImageData, .NET будет явно запускать неуправляемая безопасность кодатребовать, что означает, что авторы фреймворка решили, что принудительная проверка изображения необходима для обеспечения безопасности управляемого кода и, в конечном итоге, возможности доверять данные, которые вызывающий говорит представляет изображение. Таким образом, хотя указание flase для validateImageData может повысить производительность, в контексте безопасности менее полное доверие оно может генерировать исключение, и вам лучше доверять данным, которые вы считаете изображением.

Другие вопросы по теме