Меня беспокоит третий параметр в этой перегрузке, validateImageData. Документация мало что объясняет, в ней только говорится, что она вызывает проверку данных изображения, но без подробностей, что именно делается для проверки данных изображения?
public static Image FromStream (
Stream stream,
bool useEmbeddedColorManagement,
bool validateImageData
)
Я хочу использовать это в веб-приложении, поэтому я хочу знать, что именно произойдет, если я установлю для validateImageData значение true, я хочу быть уверенным, что то, что загружает пользователь, является действительным изображением, рекомендуется ли установить для validateImageData значение true или достаточно поймать исключение, если оно выброшено? Кроме того, может ли установка validateImageData на true повлиять на производительность каким-либо образом? (пользователи могут загружать изображения размером до 250k)
Спасибо





Почему бы просто не попробовать и не посмотреть, что произойдет с установленным, а не установленным флагом?
В любом случае вы должны обрабатывать любые исключения, которые могут возникнуть.
Я помню, как читал о некоторых проблемах с этим параметром. См. Сообщение это (оно довольно старое, но будьте осторожны).
Из 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 может повысить производительность, в контексте безопасности менее полное доверие оно может генерировать исключение, и вам лучше доверять данным, которые вы считаете изображением.
Знаете ли вы, что можно использовать Reflector, чтобы увидеть, что делает код Framework?