12

我想实现一种有效的机制来限制我的 Java Web 应用程序中的登录尝试,以防止对用户帐户的暴力攻击。

杰夫解释了原因,但没有解释如何。

Simon Willison在 Python 中展示了 Django 的实现:这对我没有帮助,因为我既不能使用 memcached,也不能使用 Django。

从头开始移植他的想法似乎也不是一件好事——我不想重新发明轮子。

我找到了一个Java 实现,虽然它看起来很幼稚:它不是 LRU 缓存,而是在 15 分钟后清除所有条目。

EHCache 可能是 memcached 的替代方案,但我没有任何经验,如果此任务有更好的替代方案,我真的不想引入另一种技术。

那么,在 Java 中实现登录限制的好方法是什么?

4

7 回答 7

7

我认为即使是 EHCache 也在用凝固汽油弹杀死一只苍蝇。问题很简单,实现也很简单。

我建议在顶层使用 servlet 过滤器,以便尽可能少地进行处理。

创建一个类来存储以下内容:

  • 尝试次数(计数)
  • 时间

现在,代码在一个 sunchronized 块中很简单:

if userid not in attemptMap:
    attemptMap.add ( userid, new attemptItem ( userid, 1, now ) )
else
    tmp = attemptMap.get ( userid )
    if (acquire lock for tmp) :
      if tmp.time + 30 > now :
          tmp.count = 0
          tmp.time = now
      tmp.count++
      if tmp.count > 3 :
          error=true
      release lock for tmp
    else : error=true

就是这样(只要代码是同步的)。

于 2009-01-19T13:52:25.867 回答
1

没有提到的一个是让他们在多次错误尝试后回答忘记密码的问题+输入他们的密码

于 2009-01-22T02:55:36.533 回答
1

我刚刚完成了由方面安全性运行的网络安全课程,其中提出的一个建议是在任何登录尝试中都包含一个自然延迟 - 理论是 1 或 2 秒的延迟对于真正的-user 但会严重阻碍暴力攻击。

于 2009-01-19T13:45:25.817 回答
0

我使用了带有用户详细信息的登录尝试计数字段。当它达到 50 时,正确的密码将被拒绝,用户必须执行密码重置。

于 2009-01-19T15:29:39.040 回答
0

登录尝试之间的时间呈指数增长怎么办?

于 2009-01-19T15:41:16.443 回答
0

EHCache 非常好,更重要的是不是由您编写的,因此您不必重新实现功能并且可能会出错。

我的解决方案将在登录代码中涉及 ​​EHCache 或更简单的东西(如果它是一个小应用程序并且我并不真正关心并发性能)。

您将存储每个 IP 的失败计数和时间戳。

  • 每次您尝试登录时,请检查是否允许他们使用失败计数和时间戳。
  • 每次您进行允许的登录尝试并失败时,将失败计数增加 1 并记录失败时间。
  • 每次您进行允许的登录尝试并成功时,都会清除该 IP 的信息。
于 2009-01-22T04:11:09.547 回答
0

保持错误的登录尝试次数,如果达到 N,则阻止用户并要求验证码或密码重置以继续。

于 2015-06-17T08:36:28.323 回答