在X登录失败后是否应锁定用户帐户?

时间:2018-03-15 20:07:19

标签: sql login coldfusion locking login-attempts

我几乎已经完成了我的登录系统的开发,还有一件我不确定的事情。我在互联网上发现了很多关于计算无效登录和锁定用户帐户的辩论。我的系统在数据库中存储用户名和密码(盐渍和散列)。如果用户输入了无效的用户名或密码,我会跟踪他们的UsernamePasswordLoginTimeSessionIDIPBrowser。这是一个例子:

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;

上面的查询会查找usernamesessionIDIP地址。如果在FailedLogin 60min表格中找到其中任何一个并且大于5,我会锁定该帐户。这里唯一的问题是我不确定这会阻止什么,暴力攻击可以在60分钟内发送太多的尝试,所以我不确定以这种方式检查失败的登录会带来什么好处。现在是否有更好的方法来处理失败的登录?我应该锁定账户吗?如果有人能提供一些想法和例子,请告诉我。谢谢。

2 个答案:

答案 0 :(得分:4)

在检查Information Security时同意@Ageax。

  

我不确定我的系统中是否需要这种安全检查。

是的,你这样做。你总是这样。这些不经常出现在新闻中的是那些。

一些最佳实践

  • 在X次登录失败后锁定帐户。
  • 记录Y过去的密码(哈希,而不是纯文本)。当有人更新他们的密码时,请检查新密码,以便他们不能重复使用最近的密码(比较哈希值)。
  • 监视超过X的失败尝试,以确定在尝试失败的情况下是否需要阻止IP地址。
  • 当用户登录失败时,请不要告诉他们具体是用户名还是密码不正确。您只是帮助黑客更快地进步。

在另一个网站上做一些阅读,看看还有什么建议。

答案 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>';
  }
}