我几乎已经完成了我的登录系统的开发,还有一件我不确定的事情。我在互联网上发现了很多关于计算无效登录和锁定用户帐户的辩论。我的系统在数据库中存储用户名和密码(盐渍和散列)。如果用户输入了无效的用户名或密码,我会跟踪他们的Username
,Password
,LoginTime
,SessionID
,IP
和Browser
。这是一个例子:
LoginID LoginTime LoginUN LoginPW LoginSessionID LoginIP LoginBrowser
1 2018-03-15 13:40:25.000 jpapis test E72E.cfusion 10.18.1.37 Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
98 2018-03-15 13:48:45.000 mhart mypass55 E72E.cfusion 10.12.1.87 Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
32 2018-03-15 14:29:14.000 skatre 1167mmB! 378E.cfusion 10.36.1.17 Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
我想知道在X尝试后我是否应该锁定帐户?如果是这样,最好的做法是什么?我找到了一种方法:
SELECT COUNT(LoginID) AS countID, DATEDIFF(mi,LoginTime,GETDATE ( )) AS TimeElapsed
FROM FailedLogins
WHERE (LoginUN = '#username#' OR LoginSessionID = '#SESSION.sessionid#' OR LoginIP = '#REMOTE_ADDR#')
AND DATEDIFF(mi,LoginTime,GETDATE ( )) <= 60
GROUP BY LoginID, LoginTime
HAVING COUNT(LoginID) >= 5;
上面的查询会查找username
,sessionID
或IP
地址。如果在FailedLogin
60min
表格中找到其中任何一个并且大于5,我会锁定该帐户。这里唯一的问题是我不确定这会阻止什么,暴力攻击可以在60分钟内发送太多的尝试,所以我不确定以这种方式检查失败的登录会带来什么好处。现在是否有更好的方法来处理失败的登录?我应该锁定账户吗?如果有人能提供一些想法和例子,请告诉我。谢谢。
答案 0 :(得分:4)
在检查Information Security时同意@Ageax。
我不确定我的系统中是否需要这种安全检查。
是的,你这样做。你总是这样。这些不经常出现在新闻中的是那些。
一些最佳实践
在另一个网站上做一些阅读,看看还有什么建议。
答案 1 :(得分:-1)
您必须仅为付费或高级帐户创建密码锁定系统,或者如果您或其他人拥有的网站非常受欢迎(超过100,000名年度观看者),因为它们最受重视,并且最有可能受到攻击。如果您期望这么多人,那么最佳实践就是实现这一点。你可以看到很多大公司在做这种做法,谷歌会锁定人们的帐户,因为他们可以包含像Google Play商店信用卡或Android Pay钱包那样的钱。对于Minecraft帐户,Netflix帐户等也是如此。这背后的算法是这样的:
if(md5($password)==$loginrow['login'])
{
//Do your login sequence here
}
else
{
if($loginrow['AttemptsInPastFifteenMinutes']>=15)
{
mysqli_query($dbconnect,'CREATE EVENT reset ON SCHEDULE EVERY 15 MINUTE DO UPDATE ' .$loginrow['user']. 'set AttemptsInPastFifteenMinutes = 0');
echo '<script>alert("You have typed in invalid passwords too many times. Please try again later.");</script>';
}
else
{
mysqli_query($dbconnect,'UPDATE logins SET AttemptsInPastFifteenMinutes=' .($loginrow['AttemptsInPastFifteenMinutes'] + 1). ' WHERE user=' .$loginrow['user']');
echo '<script>alert("Invalid username or password");</script>';
}
}