如何在 python3 的 ldap3 中防止 LDAP 注入

How to prevent LDAP-injection in ldap3 for python3

我正在使用 ldap3 库编写一些 python3 代码,并试图防止 LDAP 注入。 OWASP 注入预防作弊 sheet 建议使用 safe/parameterized API(以及其他)。但是,我无法在 ldap3 文档中找到用于编写搜索查询的安全 API 或安全方法。文档中的大多数搜索查询都使用硬编码字符串,如下所示:

conn.search('dc=demo1,dc=freeipa,dc=org', '(objectclass=person)')

并且我正在尝试避免以类似于此的方式编写查询:

conn.search(search, '(accAttrib=' + accName + ')')

此外,文档中似乎没有提及 'injection' 或 'escaping' 或类似概念。有谁知道这个库中是否完全缺少这个,或者是否有一个类似的 Python 库提供 safe/parameterized API?或者有没有人遇到过并解决过这个问题?

最后一点:我已经看到其他 Whosebug 问题指出如何使用白名单验证或转义作为防止 LDAP 注入的方法,我计划实施它们。但如果可能的话,我更愿意使用这三种方法。

我认为在 python3 中防止 LDAP 注入的最佳方法是使用 Abstraction Layer.

示例代码:

# First create a connection to ldap to use.
# I use a function that creates my connection (abstracted here)
conn = self.connect_to_ldap()

o = ObjectDef('groupOfUniqueNames', conn)
query = 'Common Name: %s' % cn
r = Reader(conn, o, 'dc=example,,dc=org', query)
r.search()

注意查询是如何抽象的吗?如果有人试图在此处 注入 搜索,查询将出错。此外,此搜索受 Reader 而不是 Writer 保护。 ldap3 文档涵盖了所有这些内容。

我有点惊讶文档似乎没有提到这一点。但是,有一个效用函数 escape_filter_chars,我相信这就是您正在寻找的:

from ldap3.utils import conv

attribute = conv.escape_filter_chars("bar)", encoding=None)
query = "(foo={0})".format(attribute)
conn.search(search, query)