我有一个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."
从安全的角度来看,您应该告诉未经验证的用户没有找到他们的用户名,或者找到了他们的用户名但密码不匹配。在
通过提供这些信息,您将为潜在攻击者提供更多有关其攻击方式的信息。在
如果攻击者可以先尝试常用用户名,然后再尝试常用密码,那么在找到匹配项之前,他就不必再费劲了,也不必尝试尽可能多的用户名/密码组合。在
相反,如果您每次只告诉未经身份验证的用户相同的消息:“该用户名或密码不匹配”,而不管他们被拒绝身份验证的原因是什么(无论他们提供的是无效的用户名、无效的密码,还是因为触发了滥用检测器而被阻止),则攻击者已经不知道他们是不是越来越接近成功,将不得不尝试密码,即使用户名可能根本不存在。在
只需将第二个
else
子句移出for
循环,而不是外部if
语句。如果到达循环末尾时没有出现错误、中断或返回,则将执行该循环。在相关问题 更多 >
编程相关推荐