14

我担心这个重载中的第三个参数 validateImageData。该文档没有对此进行太多解释,它仅说明它会导致图像数据被验证但没有详细信息,究竟做了什么来验证图像数据?

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

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

谢谢

4

4 回答 4

15

从反射器中,我们看到:

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.

于 2009-01-07T14:27:11.813 回答
5

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

但是,如果您为 validateImageData 参数指定 false,.NET 将显式触发非托管代码安全 需求,这意味着框架作者认为强制图像验证是必要的,以保证托管代码是安全的,并最终能够相信调用者所说的代表图像的数据。因此,虽然为 validateImageData 指定 flase 可能会提高性能,但在不完全信任的安全上下文中,它可能会产生异常,并且您最好相信您认为是图像的数据。

于 2009-01-07T14:31:57.950 回答
2

我记得读过该参数的一些问题。看到这篇文章(它很老但只是要小心)。

于 2009-01-07T13:56:13.513 回答
0

为什么不尝试看看设置该标志而不设置该标志会发生什么?

无论哪种情况,您都应该处理任何可能引发的异常。

于 2009-01-07T13:51:16.330 回答