SQLi的Python身份验证问题

2024-10-02 22:36:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python数据库,有两个字段:Username和passHash。数据库没问题,我已经检查过了,所有参数都是正确的。然后我需要一个身份验证系统,它将查找每一行的用户名,如果找到,查找第二个字段的密码,如果与用户提供的不同,返回“pass incorrect”。但问题是:我怎样才能让系统循环所有的行,当它完成时,它会返回“User does not exists”。。因为现在它会返回第一行搜索到的user not found,听起来很奇怪,但是让我们去D:

Ps.使用twisted和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."

Tags: inself数据库authenticationreturnifadminlogging
3条回答
result = playerDB.execute('''SELECT * FROM playerData WHERE Username='{0}' '''.format(username))
if len(result) == 1: # user found
else : # user not found

从安全的角度来看,您应该告诉未经验证的用户没有找到他们的用户名,或者找到了他们的用户名但密码不匹配。在

通过提供这些信息,您将为潜在攻击者提供更多有关其攻击方式的信息。在

如果攻击者可以先尝试常用用户名,然后再尝试常用密码,那么在找到匹配项之前,他就不必再费劲了,也不必尝试尽可能多的用户名/密码组合。在

相反,如果您每次只告诉未经身份验证的用户相同的消息:“该用户名或密码不匹配”,而不管他们被拒绝身份验证的原因是什么(无论他们提供的是无效的用户名、无效的密码,还是因为触发了滥用检测器而被阻止),则攻击者已经不知道他们是不是越来越接近成功,将不得不尝试密码,即使用户名可能根本不存在。在

只需将第二个else子句移出for循环,而不是外部if语句。如果到达循环末尾时没有出现错误、中断或返回,则将执行该循环。在

相关问题 更多 >