validateImageData参数和Image.FromStream()

时间:2009-01-07 13:40:55

标签: c# .net image-processing

我关心这个重载中的第三个参数validateImageData。文档没有解释太多,只是说它导致图像数据被验证但没有细节,究竟是做了什么来验证图像数据?

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

我想在Web应用程序中使用它,所以,我想知道如果我将validateImageData设置为true会发生什么,我想确保用户上传的是有效图像,是否建议设置validateImageData为true还是足以在抛出异常时捕获异常?另外,将validateImageData设置为true可以以任何方式影响性能吗? (用户可以上传最大250k的图片)

由于

4 个答案:

答案 0 :(得分:12)

从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

答案 1 :(得分:5)

通过仔细阅读内部反射器,您将看到默认情况下,.NET始终在名为GdipImageForceValidation的GDI +库中调用本机API(通过为validateImageData参数传递true)。我找不到有关原生API in MSDN的信息,只有this,它只告诉我们函数本身的名称。但是,这种方法似乎会导致基于Justin Roger's post的性能下降,以最快的方式通过.NET加载图像。期望任何“验证”步骤都会影响性能也是直观的。

但是,如果为validateImageData参数指定false,则.NET将显式触发unmanaged code security demand,这意味着框架作者决定强制进行图像验证是必要的,以便实现托管的承诺代码是安全的,并且最终能够信任调用者所说的所代表的数据。因此,虽然为validateImageData指定flase可能会提高性能,但在低于full-trust的安全上下文中,它可能会生成异常,并且您最好相信您认为是图像的数据。

答案 2 :(得分:2)

我记得用这个参数读了一些问题。请参阅this帖子(它很旧但只是要小心)。

答案 3 :(得分:0)

为什么不试着看看那个标志集发生了什么而没有设置?

在任何一种情况下,您都应该处理可能引发的任何异常。