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 часов, пытаясь понять это. Я был бы очень признателен, если бы вы, ребята, могли дать мне несколько советов. Спасибо.


person BillardBall    schedule 27.07.2018    source источник


Ответы (1)


Там есть несколько фиктивных вещей.

Я прокомментирую только ваш первый пример кода, потому что его может использовать любой, у кого есть этот общедоступный сервер LDAP.

l = ldap.open(сервер)

Функция ldap.open() устарела уже много лет. Вы должны использовать функцию ldap.initialize() с LDAP URI в качестве аргумента вместо этого:

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

l_search = l.поиск(..)

Это асинхронный метод, который просто возвращает идентификатор сообщения (int) базового OpenLDAP C API (libldap). Это необходимо, если вы хотите получить расширенные элементы управления, возвращенные сервером LDAP, вместе с результатами поиска. Это то, что вы хотите?

Как новичок, вы, вероятно, захотите использовать более простой метод LDAPObject. .search_s(), который немедленно возвращает список (DN, запись) 2-кортежей.

См. также: python-ldap -- Отправка запросов LDAP< /а>

а л != 1

Это вообще не имеет смысла, поскольку l — это ваш экземпляр LDAPObject (объект подключения LDAP). Обратите внимание, что LDAPObject.search() вызовет исключение, если получит целочисленный код ошибки из libldap OpenLDAP. На этом уровне нет необходимости выполнять проверку ошибок в стиле C.

filter = "cn=" + "" + ключевое слово + ""

Если ключевое слово может быть произвольным вводом, это может привести к атакам с внедрением LDAP< /а>. Не делай этого.

Для добавления произвольного ввода в фильтр LDAP используйте функцию ldap.filter.escape_filter_chars(), чтобы правильно экранировать специальные символы. Также избегайте использования имени переменной filter, поскольку это имя встроенной функции Python, и правильно заключайте фильтр в круглые скобки.

Лучший пример:

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

база = ""

Правильная база поиска, которую вы должны использовать:

base = "dc=пример,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)
person Michael Ströder    schedule 28.07.2018