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