使用 DirectorySearcher 时如何防止 LDAP 注入

Mat*_*hew 6 .net c# ldap code-injection

以前有人问这个问题但答案已经过时了,我想知道现代方法是什么。

我有一些 C# 代码可以在 Active Directory 中搜索具有 employeeid 的员工,employeeidid是一个字符串,可能来自 Web 表单或其他东西,并且不能完全信任。

DirectorySearcher search = new DirectorySearcher(new DirectoryEntry());
search.Filter = "(&(objectClass=user)(employeeid=" + id + "))";
search.PropertiesToLoad.Add("mail");
search.PropertiesToLoad.Add("telephonenumber");
SearchResult sresult = search.FindOne();
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,输入一个id可以做我并不真正打算做的事情的值并不会太难。OWASP 认为这是一个严重的漏洞。防止这种情况的最佳现代方法是什么?

如果有一个正在积极维护的替代库函数,我不希望像这样手动替换特定字符的我自己的代码。

我在任何地方看到的最佳解决方案是使用AntiXSS库:

string encoded = Microsoft.Security.Application.Encoder.LdapFilterEncode(id);
Run Code Online (Sandbox Code Playgroud)

似乎不再维护该库:

AntiXSS 现已终止 在 .NET 4.0 中,框架中包含一个 AntiXSS 版本,可以通过配置启用。在 ASP.NET v5 中,基于白名单的编码器将是唯一的编码器。因此,AntiXSS 的独立版本应被视为生命周期结束。源代码和安装程序将保持在线状态,允许使用 .NET 早期版本的人们启用替代的、基于白名单的编码,但除了安全修复之外,不会进行进一步的增强。

很多答案都指出,LinqtoAD这听起来确实是一个很好的方法,但不幸的是,它听起来并没有做好生产准备:

免责声明 该项目旨在作为实现自定义 LINQ 查询提供程序的基本示例。它尚未经过彻底测试,我们不提供任何支持。如果没有对技术行为进行适当的测试和验证,请勿在生产环境中使用它。非常欢迎用户通过本站点上的问题跟踪器报告问题和错误。

什么是现代方法?.Net 框架的较新版本中是否有任何东西可以减轻 LDAP 注入?