-1

我有一段代码:

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 来复制该故障案例。

就我而言,我认为没有人知道如何配置东西以使代码安全性失败。

4

1 回答 1

0

我假设如果有人没有许可,现在编写的代码将无法工作

对于 LinkDemand 而言,情况并非如此,它只要求直接调用者拥有目标权限。这就是 FxCop 警告您潜在问题的原因:恶意调用者可能会使用您的方法间接调用 DirectoryEntry 方法,尽管它本身没有足够的 CAS 权限来执行此操作。

对此的最佳修复取决于几件事,包括您使用的 .NET Framework 版本。对于早期的 .NET 版本,将 LinkDemand 或对不受限制的 DirectoryServicesPermission 的完整需求添加到您的方法中。如果 FxCop 很高兴,那么您就已经解决了这个特殊问题。但是,某些调用者可能无法再调用您的方法。如果这是一个问题,您需要评估您对 DirectoryEntry 的使用,并确定它是否可能被恶意调用者滥用,然后再删除保护。

对于更新的 .NET 版本,事情变得更加复杂。如果您需要这方面的帮助,请指定您所针对的 .NET 版本以及您是否认为有必要支持部分受信任的调用方。

于 2011-11-28T15:56:00.260 回答