实现登录速度检查

时间:2009-05-06 20:37:52

标签: mysql ruby login velocity

我需要为Web服务实现登录速度检查。该服务是ruby,数据库是MySql。

我可以想象这样做的方法很糟糕。例如,有一个表存储每个登录尝试的时间以及它是否成功,并且每次用户尝试登录时,查询该表以查找最后的 n 登录尝试并运行一些简单的反对它的算法。但这似乎显然非常低效。每次登录尝试都会在一个非常大的表上执行select和insert,这会使整个系统变慢。

更好的方法可能是将 n 的值硬编码为三个或类似内容,并在用户表中(存储密码验证程序的地方)添加 n < / em>包含最新 n 登录尝试的列。这将删除额外的select语句,并且用户表可能比登录尝试表要短得多。但是,如果要改变算法,它会丢失很多可能有趣的数据。

此时我倾向于使用该密码验证器在表中放置单个文本字段的变体,该文本字段包含一个序列化对象,该对象是登录尝试记录的数组。在登录尝试时,该字段将被解析和重写。这解决了固定的 n 问题,同时防止必须查询非常大的表。但是,从数据库中读取文本字段当然具有较差的磁盘访问特性,这可能最终使其成为一个糟糕的解决方案。

最后,另一种可能性是使用MySql的日志文件支持的数据库(我不知道他的名字),但我几乎一无所知,除了它应该在查询日志文件时有效。

Stack Overflow的问题是:如何在行业中正常实施登录速度检查?

更新1:

我应该定义速度检查。登录尝试的速度检查会跟踪连续故障的数量和发生连续故障的时间范围。第一个回复确实指向具有这些属性的解决方案。但我想知道,如果它保留足够的信息以允许速度检查的灵活性。从来没有建立过这样一个系统,我担心的是我忽略了速度检查的重要方面,我希望在我开始构建时考虑这个方面......

3 个答案:

答案 0 :(得分:3)

最后,我建造了类似John Boker建议的东西。用于对用户进行身份验证的表有两个新列 - failed_login_countfirst_failed_login,它们是DateTime对象。每次用户成功登录时,failed_login_count都会重置为0,而first_failed_login会重置为null(如果尚未登录)。每次登录尝试失败时,failed_login_count都会递增。如果为0,则first_failed_login获取当前时间。每次用户尝试登录时,都会在验证密码之前进行速度检查。如果failed_login_count大于0,则除以当前时间与first_failed_login之间的时间差。如果该值大于允许的最大速度,则速度检查失败。

此外,我积极地记录失败的登录尝试和失败的速度检查,以便将来进行脱机处理,以便我可以跟踪暴力破解帐户的尝试并禁用登录失败次数过多的帐户,而无需跟踪这些计算所需的详细信息在数据库本身。

答案 1 :(得分:0)

我相信asp.net默认会员提供者在其中一个用户表上有一个名为FailedPasswordAttemptCount的列,我确定它只是在每次失败尝试时递增,然后在成功时重置为0。使用该列和LastLoginAttemptTimestamp列,您可以锁定用户一段时间。

答案 2 :(得分:0)

  

我可以想象这样做的方法很糟糕。对于   例如,有一个存储的表   每次登录尝试的时间和是否   或不成功,每一个   用户尝试登录,查询的时间   该表为最后一次登录   尝试并运行一些简单的算法   反对。这看起来非常清楚   然而,效率非常低。一切   登录尝试执行选择和   插入一张相当大的桌子上   会使整个系统变慢。

如果您知道最大速度是多少,那么您可以在常规的“失败登录”表中轻松清除大量条目(每天就足够了,除非您预计每天会有数万次失败的登录)。 / p>

最好考虑一下您希望每天登录的登录次数和登录次数。