繁体   English   中英

validateImageData参数和Image.FromStream()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM