2

我刚刚对我正在处理的一个项目进行了代码分析,并且收到了这条消息的警报。

警告 17 CA2122:Microsoft.Security:“Quantizer.Quantize(Image)”调用具有 LinkDemand 的“Bitmap.LockBits(Rectangle, ImageLockMode, PixelFormat)”。通过进行此调用,“Bitmap.LockBits(Rectangle, ImageLockMode, PixelFormat)”会间接暴露给用户代码。查看以下可能公开绕过安全保护方法的调用堆栈:
->'Quantizer.Quantize(Image)' ->'Quantizer.Quantize(Image)' ->'ImageFactory.SaveFileAndReset(string)' ->'ImageFactory.保存(字符串)'

    private void SaveFileAndReset(string path)
    {
        // Fix the colour palette of gif images.
        if (this.imageFormat == ImageFormat.Gif)
        {
            OctreeQuantizer quantizer = new OctreeQuantizer(255, 8);
            this.Image = quantizer.Quantize(this.Image);
        }

        /// etc....

我可以在 MSDN 上找到的信息非常简短,我无法从中提取任何特别有意义的内容,我在网上找到的大多数答案只是建议用标志打开警告显然这是我不想做的事情确保我这样做是安全的。

有人可以解释一下这实际上意味着什么,以及我将如何解决触发警告的任何安全问题?

4

2 回答 2

4

看起来您可能在规则中遇到了误报,这似乎没有正确考虑 .NET 4.0 下的默认安全透明度设置。为避免此问题,您可以通过将以下两个程序集级属性添加到包含 ImageFactory 和 OctreeQuantizer 的程序集来简单地使默认透明度显式:

[assembly: SecurityCritical]
[assembly: SecurityRules(SecurityRuleSet.Level2)]

由于这些与 CLR 4.0 默认值匹配,因此添加属性不会影响代码的运行时行为。但是,属性的​​存在将允许 CA2122 规则识别它要检测的问题实际上并不存在于您的代码中。

如果您有兴趣了解有关透明度模型和安全规则级别的更多信息,请参阅http://blogs.msdn.com/b/shawnfa/archive/2009/11/03/transparency-101-basic-transparency-rules。 aspxhttp://blogs.msdn.com/b/shawnfa/archive/2009/11/09/transparency-as-enforcement-in-clr-v4.aspxhttp://blogs.msdn.com/b /shawnfa/archive/2009/11/12/differences-between-the-security-rule-sets.aspx

于 2012-05-24T12:29:06.570 回答
0

为避免这种情况,请确保使用而不是从另一个类调用它fxCop-error来标记包含Bitmap.LockBits(..)调用及其所有上游调用者的方法的范围。privateinternalpublic

换句话说,确保永远不会发生来自程序集外部的调用。

于 2015-06-03T10:56:43.153 回答