如果假设您有一个名为 user 的表,您将如何设计数据库:
用户表:id, username, password, password_salt, email, email_salt
您将在哪里存储他们登录失败的次数和最后一次登录失败的时间?
total_failed, last_failed_login_time
我还想记录他们的电子邮件地址是否经过验证?
这样做的最佳方法是什么(不一定要标准化,因为这涉及使用大量连接)?你有什么建议?
如果假设您有一个名为 user 的表,您将如何设计数据库:
用户表:id, username, password, password_salt, email, email_salt
您将在哪里存储他们登录失败的次数和最后一次登录失败的时间?
total_failed, last_failed_login_time
我还想记录他们的电子邮件地址是否经过验证?
这样做的最佳方法是什么(不一定要标准化,因为这涉及使用大量连接)?你有什么建议?
我会存储total_failed和last_failed_login_time在User_Table. 每当他们登录失败时,您都可以更新它。我认为email_validated也可以存储在那里,但我不确定你的意思是什么。
两者total_failed和last_failed_login_time都是非常奇怪的存储字段。通常,登录失败用于帮助检测对系统的攻击。
但不会Total failed简单地随着时间的推移逐渐上升到只是粗略衡量给定用户访问系统的时间和频率的程度,因为典型的用户有时会错误输入他们的密码。因此,该领域的大量数字不会说明太多。
Last_failed_login_time似乎也没有太大的意义,因为它消除了人们可能感兴趣的任何先前数据。
也许我错过了跟踪这些数据的意义?
首先,作为全面安全审计的一部分,操作系统可能会更好地完成这种日志记录。
从数据库设计的角度来看,在用户表中存储total_failed和并没有错。last_failed_login_time但从网络管理员的角度来看可能存在。
登录失败可能表明您已成为破解目标。作为网络管理员,我宁愿监控成功和不成功登录的数量和分布(一天中的数量)。为此,它们必须存储在单独的表中。
您可能希望实现登录尝试表,而不是为此数据使用摘要列。
您可以创建一个表来跟踪用户名、登录尝试的日期、登录尝试的状态(成功、密码错误、未知用户名等)以及与尝试本身相关的任何其他相关信息。包括(尝试的)用户名是必要的,因为对于任何使用未知用户名的尝试,用户 ID 将为 NULL。
这种结构将允许您获取您要求的信息,以及其他安全、审计和统计报告。
您可以将这两个字段存储为用户记录的一部分。唯一使您未标准化(无论如何,您已标准化为 3NF)的事实是您需要将其设为last_failed_login_time可空。
对于email_validated. 它可以作为行的一部分存储。