python-ldap无法在打开的服务器上执行任何基本搜索查询

时间:2018-07-27 23:55:15

标签: python ldap ldap-query python-ldap

我一直在尝试进行一些基本的搜索查询,但是无论如何我都无法连接到开放的LDAP服务器。我尝试了几台服务器,但都没有工作。我使用Apache Directory Studio来确保该关键字在那里,但是无论哪种方式都没有作用。我尝试了来自不同来源的各种不同代码。 这是我第一次使用 : https://www.linuxjournal.com/article/6988

import ldap


keyword = "boyle"
def main():
    server = "ldap.forumsys.com"
    username = "cn=read-only-admin,dc=example,dc=com"
    password = "password"

    try:
        l = ldap.open(server)
        l.simple_bind_s(username,password)
        print "Bound to server . . . "
        l.protocol_version = ldap.VERSION3
        print "Searching . . ."
        mysearch (l,keyword)

    except ldap.LDAPError:
        print "Couldnt connect"

def mysearch(l, keyword):

    base = ""
    scope = ldap.SCOPE_SUBTREE
    filter = "cn=" + "*" + keyword + "*"

    retrieve_attributes = None

    count = 0
    result_set = []
    timeout = 0
    try:
        result_id = l.search(base, scope, filter, retrieve_attributes)

        while l != 1:
            result_id = l.search(base, scope,filter, retrieve_attributes)
            result_type, result_data = l.result(result_id, timeout)
            if result_data == []:
                break
            else:
                if result_type == ldap.RES_SEARCH_ENTRY:
                    result_set.append(result_data)

        if len (result_set = 0):
            print "No Results"

        for i in range (len(result_set)):
            for entry in result_set[i]:
                try:
                    name = entry[1]['cn'][0]
                    mail = entry[1]['mail'][0]
                    #phone = entry[1]['telephonenumber'][0]
                    #desc = entry[1]['description'][0]
                    count = count + 1
                    print name + mail
                except:
                    pass
    except ldap.LDAPError, error_message:
        print error_message

main()

每次运行该程序时,我都会收到一个错误 {'desc':u“没有这样的对象”}

我也尝试过

import ldap

try:

  l = ldap.open("ldap.example.com")


except ldap.LDAPError, e:
  print e


base_dn = "cn=read-only-admin,dc=example,dc=com"

search_scope = ldap.SCOPE_SUBTREE
retrieve_attributes = None
search_filter = "uid=myuid"

try:
  l_search = l.search(base_dn, search_scope, search_filter, retrieve_attributes)
  result_status, result_data = l.result(l_search, 0)
  print result_data
except ldap.LDAPError, e:
  print e

此错误是 {'desc':u“无法联系LDAP服务器”}

我花了大约5个小时试图解决这个问题。如果你们能给我一些建议,我将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:2)

里面有几个伪造的东西。

我只会评论您的第一个代码示例,因为拥有public LDAP server的任何人都可以使用它。

  

l = ldap.open(服务器)

函数ldap.open()已弃用多年。您应该将函数ldap.initialize()与LDAP URI一起使用作为参数,而不是这样:

l = ldap.initialize("ldap://ldap.forumsys.com")
  

l_search = l.search(..)

这是异步方法,它仅返回基础OpenLDAP C API(libldap)的消息ID(int)。如果要检索LDAP服务器返回的扩展控件以及搜索结果,则需要它。那是你想要的吗?

作为初学者,您可能想使用更简单的方法LDAPObject.search_s(),该方法立即返回(DN,条目)2元组的列表。

另请参阅:python-ldap -- Sending LDAP requests

  

而l!= 1

这根本没有意义,因为 l 是您的 LDAPObject 实例(LDAP连接对象)。请注意,如果 LDAPObject.search()从OpenLDAP的 libldap 获取整数错误代码,则会引发异常。无需在此级别进行C样式错误检查。

  

filter =“ cn =” +“ ” +关键字+“

如果关键字可以任意输入,则容易产生LDAP injection attacks。不要那样做。

要向LDAP过滤器中添加任意输入,请使用函数ldap.filter.escape_filter_chars()来正确转义特殊字符。还要避免使用变量名 filter ,因为它是内置Python函数的名称,并正确将过滤器括在括号中。

更好的例子:

ldap_filter = "(cn=*%s*)" % (ldap.filter.escape_filter_chars(keyword))
  

base =“”

您必须使用的正确搜索基础是:

base =“ dc = example,dc = com”

否则将引发ldap.NO_SUCH_OBJECT

因此,这是一个完整的示例:

import pprint

import ldap
from ldap.filter import escape_filter_chars

BINDDN = "cn=read-only-admin,dc=example,dc=com"
BINDPW = "password"
KEYWORD = "boyle"

ldap_conn = ldap.initialize("ldap://ldap.forumsys.com")
ldap_conn.simple_bind_s(BINDDN, BINDPW)

ldap_filter = "(cn=*%s*)" % (ldap.filter.escape_filter_chars(KEYWORD))

ldap_results = ldap_conn.search_s(
    "dc=example,dc=com",
    ldap.SCOPE_SUBTREE,
    ldap_filter,
)

pprint.pprint(ldap_results)

答案 1 :(得分:0)

您的第一个查询的基数无效。应该是dc=example,dc=com,而不是""

您的第二个查询指的是我无法联系的未知主机。