2012-05-20 61 views
2

我剛剛在我正在進行的項目上運行代碼分析,並且我收到了此消息的警報。代碼分析期間的LinkDemand警告。錯誤CA2122

警告17 CA2122:Microsoft.Security: 'Quantizer.Quantize(圖像)' 調用到 'Bitmap.LockBits(矩形,ImageLockMode,的PixelFormat)' ,其具有的LinkDemand。通過進行此調用, 'Bitmap.LockBits(Rectangle,ImageLockMode,PixelFormat)'間接暴露給用戶代碼 。回顧下面的調用堆棧可能會暴露一種規避安全保護的方法:
- >'Quantizer.Quantize(Image)' - >'Quantizer.Quantize(Image)' - >'ImageFactory.SaveFileAndReset(string)' - >' 「ImageFactory.Save(串)」

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

您定位的.NET版本是什麼? –

+0

@Nicole Calinoiu:.NET Framework 4 –

+0

OctreeQuantizer和ImageFactory是否在同一個程序集中?是/是強烈命名的程序集?他/他們裝飾有以下任何屬性:AllowPartiallyTrustedCallers,SecurityTransparent,SecurityCritical,SecurityRules? –

回答

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

-1

爲了避免這種情況fxCop-error務必記其中包含Bitmap.LockBits(..)通話和所有與private上游來電方法的範圍和情況下將其與另一類internal而不是public調用。

換句話說,確保來自外部的呼叫永遠不會發生。

相關問題