当前位置:  开发笔记 > 编程语言 > 正文

validateImageData参数和Image.FromStream()

如何解决《validateImageData参数和Image.FromStream()》经验,为你挑选了2个好方法。

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

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

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

谢谢



1> Frank Kruege..:

从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.



2> Scott Willek..:

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

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

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有