Параметр validateImageData и Image.FromStream () - PullRequest
14 голосов
/ 07 января 2009

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

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

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

Спасибо

Ответы [ 4 ]

12 голосов
/ 07 января 2009

Из Отражателя мы видим:

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.

5 голосов
/ 07 января 2009

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

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

2 голосов
/ 07 января 2009

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

0 голосов
/ 07 января 2009

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

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

...