我在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."
答案 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
语句。如果你在循环结束时没有错误,中断或返回,它将被执行。