我正在使用ldap3库编写一些python3代码,并且我试图阻止LDAP注入。 OWASP注射防止备忘单建议使用安全/参数化API(以及其他内容)。但是,我无法在ldap3文档中找到用于撰写搜索查询的安全API或安全方法。文档中的大多数搜索查询都使用硬编码字符串,如下所示:
conn.search('dc=demo1,dc=freeipa,dc=org', '(objectclass=person)')
我试图避免以类似的方式撰写查询:
conn.search(search, '(accAttrib=' + accName + ')')
另外,似乎没有提到注射'或者'逃避'或文档中的类似概念。有没有人知道这个库中是否缺少这个,或者是否有类似的Python库提供安全/参数化的API?或者有没有人遇到并解决过这个问题?
最后一点:我已经看到其他StackOverflow问题,指出如何使用白名单验证或转义作为防止LDAP注入的方法,我计划实施它们。但如果可能的话,我更愿意使用这三种方法。
答案 0 :(得分:1)
我认为在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()
注意查询是如何抽象的?如果有人在此处尝试注入搜索,则查询会出错。此外,此搜索受读者而非 Writer 保护。 ldap3文档介绍了所有这些。
答案 1 :(得分:0)
我对文档似乎没有提到这一点感到有些惊讶。但是,有一个实用程序功能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)