2

作業中のプロジェクトでコード分析を実行したところ、このメッセージが表示されました。

警告17CA2122: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。 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で見つけた情報は非常に簡潔で、特に意味のあるものを抽出することはできませんでした。オンラインで見つけたほとんどの回答は、フラグを付けて警告を表示することを示唆しているだけです。私がそうしても安全だと確信してください。

誰かがこれが実際に何を意味するのか、そして警告を引き起こしているセキュリティ問題を修正する方法を説明してもらえますか?

4

2 に答える 2

4

ルールで誤検知が発生した可能性があります。これは、.NET4.0でのデフォルトのセキュリティ透過設定を適切に考慮していないようです。この問題を回避するには、ImageFactoryとOctreeQuantizerを含むアセンブリに次の2つのアセンブリレベルの属性を追加することで、デフォルトの透明度を明示的にすることができます。

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

これらはCLR4.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.aspx、およびhttp://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 に答える