我刚刚在我正在处理的项目上运行代码分析,并且我已收到此消息的警告。
警告17 CA2122:Microsoft .Security:'Quantizer.Quantize(Image)' 调用'Bitmap.LockBits(Rectangle,ImageLockMode,PixelFormat)' 它有一个LinkDemand。通过这个电话, 'Bitmap.LockBits(Rectangle,ImageLockMode,PixelFormat)'是间接的 暴露给用户代码。查看可能的以下调用堆栈 揭露绕过安全保护的方法:
- >'Quantizer.Quantize(Image)' - >'Quantizer.Quantize(Image)' - >'ImageFactory.SaveFileAndReset(string)' - >'ImageFactory.Save(string)'
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上可以找到的信息非常简短,我无法从中提取任何特别有意义的内容,我在网上发现的大多数答案只是建议用标志转动警告显然这是我不想做的事情我并不完全确定这样做是安全的。
有人可以解释一下这实际意味着什么,以及我将如何解决触发警告的任何安全问题?
答案 0 :(得分: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.aspx,http://blogs.msdn.com/b/shawnfa/archive/2009/11/09/transparency-as-enforcement-in-clr-v4.aspx和http://blogs.msdn.com/b/shawnfa/archive/2009/11/12/differences-between-the-security-rule-sets.aspx。
答案 1 :(得分:0)
要避免这种情况fxCop-error
,请确保将包含Bitmap.LockBits(..)
调用的方法的范围及其所有上游调用方标记为private
,并在以下情况下从另一个类调用它internal
代替public
。
换句话说,确保来自程序集外部的调用永远不会发生。