我有一段代码:
public void MyMethod()
{
DirectoryEntry de;
...
de.AuthenticationType = AuthenticationTypes.Secure;
...
}
FxCop窒息:
CA2122:不要间接暴露具有链接需求的方法
解决方法:
MyMethod()
调用DirectoryEntry.AuthenticationType.set(AuthenticationTypes)
其中有一个 LinkDemand。
通过进行此调用,DirectoryEntry.AuthenticationType.set(AuthenticationTypes)
间接暴露给用户代码。Info:不要用不执行安全检查的方法包装受 LinkDemand 保护的方法。LinkDemand 检查直接调用者的权限,而不是检查调用堆栈中所有调用者的权限。在这种情况下,将检查包装方法的权限。如果包装方法本身不检查调用堆栈中更高调用者的权限,恶意代码可能能够执行被包装的函数,即使它没有这样做的权限。”
我完全赞成在某个地方添加一些东西来“解决”这个问题。但是如果它会导致当前为客户工作的代码自发地不为客户工作,它就不能添加它。
注意:我不知道要添加什么,或者在哪里添加(FxCop 不包含该信息),如果它是死胡同,我不想深入研究代码安全的秘密世界。
如果我向 中添加“安全检查*” MyMethod
,当前有效的代码是否有可能停止工作?
我假设如果有人没有许可,现在编写的代码将无法工作。换句话说:
directoryEntry.AuthenticationType = AuthenticationTypes.Secure
如果有人没有正确的“权限”,将会失败。在调用堆栈的更高位置添加“安全检查”不会改变这一事实 - 只会更快地触发失败。在这种情况下,添加安全检查是可以的。
另一方面,如果:
public void MyMethod() {...}
MyMethod();
目前有效,但
[SecurityCheck(...)]
public void MyMethod() {...}
AD.MyMethod()
将开始失败,然后我无法真正添加它。
特别是在每个人都使用的库代码中。
我无法自己测试的原因是没有人知道如何复制出现问题的情况。
就像大多数人通过尝试使用用户名和密码连接到 AD 并读取属性来检查活动目录的凭据一样。即使用户名/密码正确,您也可能无法读取属性。我敢打赌,除了我自己之外,没有人知道配置 ActiveDirectory 来复制该故障案例。
就我而言,我认为没有人知道如何配置东西以使代码安全性失败。