关于代码访问安全与无法验证的代码的困惑

时间:2019-05-21 18:28:09

标签: c# code-access-security

我为正确“设置”我的无法验证的方法以使其符合代码访问安全性准则而需要做的事情感到困惑。


给出以下方法

[MethodImpl(MethodImplOptions.ForwardRef)]
private extern void DoStuffUnverifiable();

PEVerify认为无法验证,我绝对需要将哪些属性应用于方法定义?

  • [SecurityCritical]
  • [SecuritySafeCritical]

我该如何在这两者之间做出决定?此外,

  • 我需要设置[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]吗?
  • 如果是,我是否使用SecurityAction.Demand或其他名称?

我肯定需要应用其他任何属性吗?我有什么可以应用的,尽管不是必需的?

1 个答案:

答案 0 :(得分:2)

在透明性模型中,使用[SecurityCritical]属性标记对安全性要求较高的方法:

[SecurityCritical]
public Key GetTVRoomKey() { ... }

所有“危险”方法(包含CLR认为可能会破坏安全性并允许囚犯 转义)必须标记为[SecurityCritical][SecuritySafeCritical]。这包括:

  • 无法验证(不安全)的方法
  • 通过P / Invoke或COM互操作调用非托管代码的方法

  • 声明权限或调用链接需求方法的方法

  • 调用[SecurityCritical]方法的方法

  • 覆盖虚拟[SecurityCritical]方法的方法

[SecurityCritical]的意思是“此方法可以允许部分受信任的呼叫者逃脱沙盒”。 [SecuritySafeCritical]的意思是“此方法可以处理对安全至关重要的事情,但要有适当的保护措施 因此对于部分受信任的呼叫者来说是安全的。”


是的,在您的情况下-肯定需要[SecurityCritical],如果您想提高安全性,请使用[SecuritySafeCritical]