3

我在类 Bar 上有一个属性 Foo:

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

两者GetFooSetFoo装饰有:

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

结果,FxCop 正确地抱怨 Foo 属性(或者更确切地说它的隐式 getter 和 setter 方法)没有相同的 LinkDemand:

CA2122:Microsoft.Security:“Bar.Foo.get()”调用具有 LinkDemand 的“Bar.GetFoo()”。通过进行此调用,“Bar.GetFoo()”间接暴露给用户代码。查看以下可能公开绕过安全保护的方法的调用堆栈:

但是,当我尝试将相同SecurityPermission的属性应用于属性以修复此警告时,结果证明属性不是该属性的有效目标。

如何正确修复此 FxCop 警告?


编辑:回应 Eric Lippert 的评论“为什么是 LinkDemand”?

  1. 我使用 Marshal.GetIUnknownForObject 编写了一个函数,该函数具有 LinkDemand 非托管代码权限。
  2. 我跑了 FxCop,它抱怨 CA2122
  3. 我在 CA2122 上搜索了有关错误含义以及如何解决它的提示
  4. 在第一个谷歌点击中,我看到了 Micheal Fanning 使用 LinkDemand 解决错误的建议

在阅读了您似乎质疑我的理智的反应后,我很快猜到范宁的建议不适用于我的情况。我现在查看了Demand 与 LinkDemand文章,并将尝试改用 Demand。

4

2 回答 2

6

您应该能够将属性直接应用于 getter 和 setter,即:

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

   [SecurityPermission(...)]
   set
   {
      SetFoo(value);
   }
}
于 2009-10-06T17:05:46.187 回答
0

仅供参考,您可以使用

[PermissionSetAttribute(SecurityAction.LinkDemand, Name="FullTrust")]

请参阅页面: 此安全警告是什么意思(.Net Process 类)?

于 2012-06-06T10:44:21.743 回答