有几个关于限制登录尝试的问题,但没有人真正讨论过存储登录尝试记录的优点或缺点或不同的方式(例如,大多数都集中在限制与验证码的问题上,不是我感兴趣的)。相反,我试图找出在数据库中记录这些信息的最佳方法,该方法很有用,但不会对性能产生太大影响。
方法 1) 创建一个表,记录:IP 地址、尝试的用户名和尝试时间。然后,当用户尝试登录时,我运行一个 select 来确定在过去 5 分钟内尝试用户名的次数(或在过去 5 分钟内尝试特定 IP 地址的次数)。如果超过一定数量,则限制登录尝试或显示验证码。
这允许基于用户名和 IP 地址进行限制(如果攻击使用单个密码尝试许多不同的用户名),并创建一个易于审核的记录,记录所发生的情况,但每次登录尝试都需要插入,并且在至少一个额外的 SELECT。
方法2)创建一个类似的表,记录失败的尝试次数和上次登录时间。这可能会导致更小的数据库表和更快的 SELECT 语句(不需要 COUNT),但提供的控制较少,需要分析的数据也较少。
方法 3) 与方法 2 类似,但将此信息存储在 User 表本身中。这意味着不需要额外的 SELECT 语句,尽管它会向用户表添加额外的、可能是不必要的信息。它也不允许方法 1 提供的额外控制和信息。
其他方法:将登录尝试存储在 mysql MEMORY 表或 sqlite 内存表中。这将减少由于磁盘性能造成的性能损失,但仍然需要数据库调用,并且不允许对登录尝试进行长期审核,因为数据不会持久。
有什么好的方法可以做到这一点或者你自己已经实现了吗?
最佳答案
听起来您正在过早地进行优化。
按照其他开发人员期望的实现方式来实现它,然后衡量性能。如果您发现此时需要优化,请根据您的测量结果采取一些步骤。
我希望方法 #1 是最自然的解决方案。
作为旁注:我会巧妙地将代码部分分开,a)决定是否有人进行黑客攻击,b)决定采取什么操作。您很可能会多次尝试通过优化查询来使这部分正确。
关于database - 设计数据库记录失败登录,防止暴力破解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1195290/