Python与SQLite的认证问题

1 投票
3 回答
1345 浏览
提问于 2025-04-16 22:23

我在Python中有一个数据库,里面有两个字段:用户名和密码哈希值。数据库没问题,我已经检查过所有参数都是正确的。接下来,我需要一个认证系统,它会检查每一行的用户名,如果找到了,就再查看第二个字段的密码,如果和用户输入的不一样,就返回“密码不正确”。但问题是:我该怎么做才能让系统遍历所有行,等它检查完后再返回“用户不存在”呢?因为现在它在第一行查找时就返回用户未找到,听起来真让人觉得很菜,但我们还是来解决这个问题吧。

另外,我使用的是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

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能理解这些数据,我们通常需要对它们进行一些处理和转换。

比如说,如果你从用户那里获取了一个数字,但这个数字是以字符串的形式存在的(也就是用引号包起来的),那么在进行数学运算之前,你需要把它转换成真正的数字。这个过程就叫做“类型转换”。

另外,有时候我们需要把一个复杂的数据结构,比如一个列表或者字典,变得更简单,或者提取出我们需要的部分。这种操作也很常见,通常我们会用循环或者一些内置的函数来完成。

总之,处理数据是编程中非常重要的一部分,掌握这些基本的操作可以帮助你更好地理解和使用编程语言。

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

从安全的角度来看,你不应该告诉没有登录的用户,他们的用户名没有找到,或者他们的用户名找到了但密码不匹配。

这样做会让潜在的攻击者获得更多的信息,帮助他们更容易地进行攻击。

如果攻击者可以尝试一些常见的用户名,然后再尝试常见的密码,他们就不需要花太多力气,或者尝试太多的用户名和密码组合,就能找到匹配的。

相反,如果你每次都告诉没有登录的用户同样的信息:“这个用户名或密码不匹配”,无论他们被拒绝的原因是什么(比如输入了无效的用户名、无效的密码,或者因为触发了滥用检测而被阻止),那么攻击者就不知道自己是否离成功更近了,他们会不得不在可能根本不存在的用户名上尝试密码。

0

只需要把你的第二个 else 语句放到 for 循环里面,而不是放在外面的 if 语句里。如果你在循环结束时没有遇到错误、没有中断,也没有返回,那么这个 else 语句就会被执行。

撰写回答