关于代码访问安全与无法验证代码的混淆
Confusion regarding code access security with unverifiable code
我很困惑我需要做什么才能正确地"set up"我无法验证的方法以使其符合代码访问安全准则。
给出如下方法
[MethodImpl(MethodImplOptions.ForwardRef)]
private extern void DoStuffUnverifiable();
PEVerify
认为无法验证,我绝对需要将哪些属性应用于方法定义?
[SecurityCritical]
?
[SecuritySafeCritical]
?
我该如何在这两者之间做出选择?此外,
- 需要设置
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
吗?
- 如果是,我是使用
SecurityAction.Demand
还是其他?
是否还有其他属性是我绝对需要应用的?有什么我可以可以申请的吗?
在透明模型中,security-critical 方法用 [SecurityCritical]
属性标记:
[SecurityCritical]
public Key GetTVRoomKey() { ... }
所有“危险”方法(包含 CLR 认为可能破坏安全并允许犯人
escape) 必须用 [SecurityCritical]
或 [SecuritySafeCritical]
标记。这包括:
- 无法验证(不安全)的方法
通过 P/Invoke 或 COM 互操作调用非托管代码的方法
声明权限或调用link-demanding方法的方法
调用 [SecurityCritical] 方法的方法
覆盖虚拟 [SecurityCritical] 方法的方法
[SecurityCritical]
表示“此方法可能允许部分受信任的调用者逃离沙箱”。
[SecuritySafeCritical]
意思是“这个方法做 security-critical 事情——但是有适当的保护措施
因此对于部分信任的呼叫者来说是安全的”。
所以是的,在你的情况下 - [SecurityCritical]
肯定是必需的,如果你想要额外的安全,请使用 [SecuritySafeCritical]
我很困惑我需要做什么才能正确地"set up"我无法验证的方法以使其符合代码访问安全准则。
给出如下方法
[MethodImpl(MethodImplOptions.ForwardRef)]
private extern void DoStuffUnverifiable();
PEVerify
认为无法验证,我绝对需要将哪些属性应用于方法定义?
[SecurityCritical]
?[SecuritySafeCritical]
?
我该如何在这两者之间做出选择?此外,
- 需要设置
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
吗? - 如果是,我是使用
SecurityAction.Demand
还是其他?
是否还有其他属性是我绝对需要应用的?有什么我可以可以申请的吗?
在透明模型中,security-critical 方法用 [SecurityCritical]
属性标记:
[SecurityCritical]
public Key GetTVRoomKey() { ... }
所有“危险”方法(包含 CLR 认为可能破坏安全并允许犯人
escape) 必须用 [SecurityCritical]
或 [SecuritySafeCritical]
标记。这包括:
- 无法验证(不安全)的方法
通过 P/Invoke 或 COM 互操作调用非托管代码的方法
声明权限或调用link-demanding方法的方法
调用 [SecurityCritical] 方法的方法
覆盖虚拟 [SecurityCritical] 方法的方法
[SecurityCritical]
表示“此方法可能允许部分受信任的调用者逃离沙箱”。
[SecuritySafeCritical]
意思是“这个方法做 security-critical 事情——但是有适当的保护措施
因此对于部分信任的呼叫者来说是安全的”。
所以是的,在你的情况下 - [SecurityCritical]
肯定是必需的,如果你想要额外的安全,请使用 [SecuritySafeCritical]