Проблема аутентификации Python с SQLite - PullRequest
1 голос
/ 27 июля 2011

У меня есть база данных на python с 2 полями: имя пользователя и пароль. БД в порядке, я уже проверил и все параметры верны. Затем мне нужна система аутентификации, которая будет искать в каждой строке имя пользователя, если он найдет, искать во 2-м поле пароль, если он не совпадает с предоставленным пользователем, возвращать «пройти неправильно». но проблема в том, как я могу это сделать, чтобы система перебрала все строки, и когда она закончит работу, она вернет «Пользователь не существует». Потому что теперь он возвращает пользователя, которого не нашли в первой строке поиска чертовски нуб, но поехали D:

Ps. используя витую и sqlite3

    def authenticate(self, username, password):
    playerDB.execute('''SELECT * FROM playerData''')
    for row in playerDB:
        if row[0] == username:
            if row[1] == password:
                if username in ADMIN_NAMES:
                    self.server.sendOutput("Admin authentication: %s" % username)
                    logging.info("Admin authentication: %s" % username)
                return "Authenticated"
            else:
                logging.info("Authentication Fail: %s" % username)
                return "Password doesn't matches username."

        else:
            return "This player doesn't exists."

Ответы [ 3 ]

3 голосов
/ 27 июля 2011

С точки зрения безопасности, вы должны , а не сообщать неаутентифицированным пользователям, что их имя пользователя не найдено или что их имя найдено, но пароль не совпадает.

Предоставляя эту информацию, вы даете потенциальным злоумышленникам больше информации о том, как они могут атаковать.

Если злоумышленник может попробовать общие имена пользователей, а затем попробовать общие пароли, он не будет иметьработать почти так же усердно, или попробовать почти столько же комбинаций имени пользователя и пароля, прежде чем найти совпадение.

Если вместо этого вы просто сообщаете неаутентифицированным пользователям одно и то же сообщение каждый раз: «Это имя пользователя или пароль не совпадают» независимо от причины , почему им было отказано в аутентификации (если они предоставилиневерное имя пользователя, неверный пароль или они блокируются из-за того, что они вызвали детектор злоупотреблений), тогда злоумышленник не знает, приближается ли он к успеху, и ему придется пробовать пароли даже для имен пользователей, которые могут даже не существовать.

0 голосов
/ 27 июля 2011

Просто переместите ваше второе предложение else в цикл for вместо внешнего оператора if. Если вы дойдете до конца цикла без ошибки, прерывания или возврата, он будет выполнен.

0 голосов
/ 27 июля 2011
result = playerDB.execute('''SELECT * FROM playerData WHERE Username='{0}' '''.format(username))
if len(result) == 1: # user found
else : # user not found
...