database - 设计数据库记录失败登录,防止暴力破解

标签 database security authentication

有几个关于限制登录尝试的问题,但没有人真正讨论过存储登录尝试记录的优点或缺点或不同的方式(例如,大多数都集中在限制与验证码的问题上,不是我感兴趣的)。相反,我试图找出在数据库中记录这些信息的最佳方法,该方法很有用,但不会对性能产生太大影响。

方法 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/

相关文章:

.net - 如何在 Entity Framework 5.0 中获取数据集作为查询结果?

php - 移动应用程序的安全问题

PHP: mysql 设置登录

javascript - 我可以在其他人的域上托管文件或文件夹吗?

php - PHP 中的魔术引号

WCF 架构,因此我可以使用回调并针对 AD 进行身份验证

security - 我可以在移动应用程序中使用 localstorage 安全地实现 cookieless "keep me signed in"吗?

java - Android应用程序登录抽屉导航无法点击 fragment

mysql - 基于两张表修复数据库

mysql - 数据库设计——Follow System of billions of records