2009-10-06 45 views
3

我有一類酒吧屬性的Foo:當屬性getter/setter需要LinkDemand時,我該如何安撫FxCop?

public int Foo 
{ 
    get 
    { 
     return GetFoo(); 
    } 
    set 
    { 
     SetFoo(value); 
    } 
} 

兩個GetFooSetFoo都裝飾有:

[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] 

結果,FxCop的正確抱怨說,美孚財產(或者更確切地說,其隱含的getter和setter方法)不具有相同的LinkDemand:

CA2122:Microsoft.Security: 'Bar.Foo.get()'調用 'Bar.GetFoo()',它有一個LinkDemand。 通過這個調用,'Bar.GetFoo()'是間接暴露給用戶代碼的 。 評論說 可能暴露的方式如下調用堆棧,以規避 安全保護:

然而,當我試圖同SecurityPermission屬性應用到的財產,以解決這個警告,原來這個屬性是不此屬性的有效目標。

如何正確修復此FxCop警告?


編輯:迴應Eric Lippert的評論「爲什麼地球上的LinkDemand」?

  1. 我寫了使用 Marshal.GetIUnknownForObject,這 具有的LinkDemand對於非託管代碼權限的功能。
  2. 我跑的FxCop,這與CA2122
  3. 抱怨我GOOGLE CA2122尋找什麼錯誤的手段提示 以及如何 解決它
  4. 在第一first google hit我 看到邁克爾·範寧的建議使用 的LinkDemand來解決錯誤

看完你的反應似乎質疑我的理智後,我很快猜想,範寧的建議不適用於我的情況。我現在看看Demand vs. LinkDemand文章,並嘗試使用Demand。

+5

另一個好要問的問題是」爲什麼地球上,你做一個鏈接對非託管代碼權限的需求?「這讓我感到非常危險。你能描述爲什麼這不是一個完整的需求? – 2009-10-06 17:34:21

+1

Re:你的更新:需要記住的重要一點是,鏈接需求意味着「我將跳過犧牲全部需求;爲了獲得更好的性能,*我的調用者*負責確保安全使用此方法」。如果您是調用者,那麼*您*現在負責確保沒有惡作劇者可以通過使用您的代碼來濫用底層方法。您可以選擇通過進一步宣傳降價,並要求*您的*來電者承擔責任,或者您可以發出全部需求,或者您可以找到其他方法來確保安全。 – 2009-10-07 17:11:38

+0

+1以迴應Eric的評論。 「*爲什麼需要鏈接?因爲FxCop告訴我。*」 – 2011-11-28 15:05:37

回答

6

你應該能夠屬性直接向getter和setter,即:

public int Foo 
{ 
    [SecurityPermission(...)] 
    get 
    { 
     return GetFoo(); 
    } 

    [SecurityPermission(...)] 
    set 
    { 
     SetFoo(value); 
    } 
} 
相關問題