SQLite的Python身份验证问题

时间:2011-07-27 18:44:59

标签: python sql sqlite authentication twisted

我在python中有一个包含2个字段的数据库:Username和passHash。数据库没问题,我已经检查过,所有参数都是正确的。然后我需要一个身份验证系统,它会查找用户名的每一行,如果找到,则查看密码的第二个字段,如果不是与用户提供的相同,则返回“传递不正确”。但问题是:我怎么能这样做,所以系统将遍历所有行,当它完成时,它将返回“用户不存在”..因为现在它返回搜索到的第一行中找不到的用户,声音吓坏了,但是我们去吧D:

聚苯乙烯。使用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."

3 个答案:

答案 0 :(得分:3)

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

通过提供此信息,您可以向潜在攻击者提供有关攻击方式的更多信息。

如果攻击者可以尝试使用普通用户名,然后尝试使用常用密码,那么在找到匹配项之前,他几乎不必努力工作,或者尝试使用几乎同样多的用户名/密码组合。

相反,如果您只是告诉未经身份验证的用户每次都使用相同的消息:“该用户名或密码不匹配”,无论为什么他们被拒绝身份验证的原因(天气他们提供了无效的用户名) ,一个无效的密码,或因为它们触发滥用检测器而被阻止),然后攻击者不知道他们是否越来越接近成功,并且即使在甚至可能不存在的用户名上也必须尝试密码。

答案 1 :(得分:0)

result = playerDB.execute('''SELECT * FROM playerData WHERE Username='{0}' '''.format(username))
if len(result) == 1: # user found
else : # user not found

答案 2 :(得分:0)

只需将第二个else子句移到for循环而不是外部if语句。如果你在循环结束时没有错误,中断或返回,它将被执行。