ValidateImageData и Image.FromStream()

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

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

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

Спасибо

Ответ 1

Из рефлектора мы видим:

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 +). Документация для этой функции не очень хорошая:

Эта функция принудительно проверяет изображение.

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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