c# - 关于代码访问安全与无法验证代码的混淆

标签 c# code-access-security

我很困惑我需要做什么才能正确“设置”我无法验证的方法,使其符合代码访问安全准则。


给定以下方法

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

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

  • [SecurityCritical]
  • [SecuritySafeCritical]?

我如何在这两者之间做出选择?进一步,

  • 我是否需要设置 [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
  • 如果是这样,我是使用 SecurityAction.Demand 还是其他什么?

是否有任何其他属性是我绝对需要应用的?有什么我可以申请的,虽然不是必需的?

最佳答案

在透明模型中,安全关键方法用[SecurityCritical] 属性标记:

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

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

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

  • 断言权限或调用链接要求方法的方法

  • 调用 [SecurityCritical] 方法的方法

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

[SecurityCritical] 表示“此方法可能允许部分受信任的调用者逃离沙箱”。 [SecuritySafeCritical] 意思是“这个方法做安全关键的事情——但有适当的保护措施 因此对于部分信任的调用者来说是安全的”。


所以是的,在您的情况下 - [SecurityCritical] 肯定是必需的,如果您想要额外的安全性,请使用 [SecuritySafeCritical]

关于c# - 关于代码访问安全与无法验证代码的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56244374/

相关文章:

c# - 如何从 ELMAH 日志中删除 "Auth_Password"

Python:Dennis Nedry - 安全

c# - 由于签名或安全透明性,Create Delegate 抛出绑定(bind)错误

c++ - 保护新交所算法的安全

c# - System.Text.Json 序列化 Unicode 字符(如表情符号)的问题

c# - Linq:计算行组,包括 0 行缺失行

javascript - 我如何使用 jquery ajax 将 webapi Controller 中的 webform 值作为模型类传递

c# - Resolve 的 Unity 通用重载

c++ - 编辑和编译源代码,而无需将拷贝存储在磁盘存储器中

java - 为什么Java Reflect可以访问私有(private)字段/方法?