我很困惑我需要做什么才能正确“设置”我无法验证的方法,使其符合代码访问安全准则。
给定以下方法
[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/