[英]validateImageData parameter and Image.FromStream()
我关心这个重载中的第三个参数validateImageData。 文档没有解释太多,只是说它导致图像数据被验证但没有细节,究竟是做了什么来验证图像数据?
public static Image FromStream (
Stream stream,
bool useEmbeddedColorManagement,
bool validateImageData
)
我想在Web应用程序中使用它,所以,我想知道如果我将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 +的一个包装器)。 这个函数的文档不是很好:
此功能强制验证图像。
不是很有用。 但是,重点是 - 询问图像文件以确保加载是安全的。 这可能导致整个图像被加载到内存中。
如果您接受来自用户的输入,我当然会将此标志设置为true - 您永远不会知道用户将上传哪种文件(格式错误或其他)。 比抱歉更安全。 这就是默认为true
。
另请注意,建议不要将GDI +用于服务器环境。 你最好使用System.Windows.Media.Imaging
。
通过仔细阅读内部反射器,您将看到默认情况下.NET始终在名为GdipImageForceValidation的GDI +库中调用本机API(通过为validateImageData参数传递true)。 我找不到MSDN中的本机API ,只有这个 ,它告诉我们的不过是函数本身的名称。 但是,看起来这种方法会导致性能下降,这是基于Justin Roger关于通过.NET以最快的方式加载图像的帖子 。 期望任何“验证”步骤都会影响性能也是直观的。
但是,如果为validateImageData参数指定false,则.NET将显式触发非托管代码安全性 需求 ,这意味着框架作者决定强制进行图像验证是必要的,以便使托管代码的承诺变得安全,并最终能够相信调用者所说的数据代表一个图像。 因此,虽然为validateImageData指定flase可能会提高性能,但在不完全信任的安全上下文中,它可能会生成异常,并且您最好信任您认为是图像的数据。
我记得用这个参数读了一些问题。 看到这篇文章(它很老了,但要小心)。
为什么不试着看看那个标志集发生了什么而没有设置?
在任何一种情况下,您都应该处理可能引发的任何异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.