Как отрегулировать попытки входа в систему в веб-приложении Java? - PullRequest
12 голосов
/ 19 января 2009

Я хочу реализовать эффективный механизм для предотвращения попыток входа в систему в моем веб-приложении на Java, чтобы предотвратить атаки методом "грубой силы" на учетные записи пользователей.

Джефф объяснил почему, но не как.

Саймон Виллисон показал реализацию в Python для Django : Это не очень помогает мне, так как я не могу использовать memcached и Django.

Портирование его идей с нуля тоже не кажется удачным - я не хочу изобретать велосипед.

Я нашел одну реализацию Java , хотя это кажется довольно наивным: вместо кэша LRU он просто очищает все записи через 15 минут.

EHCache может быть альтернативой для memcached, но у меня нет никакого опыта с этим, и я действительно не хочу внедрять еще одну технологию, если есть более подходящие альтернативы для этой задачи.

Итак, что является хорошим способом реализации регулирования входа в Java?

Ответы [ 7 ]

7 голосов
/ 19 января 2009

Я думаю, что даже EHCache убивает муху напалмовой бомбой. Проблема проста, как и реализация.

Я предлагаю использовать фильтр сервлетов на верхнем уровне, чтобы сделать как можно меньше обработки.

Создайте класс для хранения следующего:

  • Количество попыток (кол-во)
  • Время

Теперь, простой код в синхронизированном блоке:

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

Вот и все (пока код синхронизирован).

1 голос
/ 22 января 2009

Тот, кто не был упомянут, заставляет их отвечать на вопросы о забытом пароле после стольких неудачных попыток + введите свой пароль

1 голос
/ 19 января 2009

Я только что закончил курс веб-безопасности, проводимый аспектной безопасностью, и одно из предложений, которое из этого вышло, заключалось в том, чтобы просто включить естественную задержку при любой попытке входа в систему - теория состоит в том, что 1 или 2-секундная задержка ничего не значит для реального пользователя, но серьезно затруднит атаки методом перебора.

0 голосов
/ 17 июня 2015

Укажите неверный номер попытки входа в систему, и если он достигнет N, заблокируйте пользователя и попросите продолжить ввод кода или пароля.

0 голосов
/ 22 января 2009

EHCache довольно хорош, и что более важно, Not Written By You, так что вам не нужно переопределять функции и, возможно, неправильно их понимать.

Мое решение будет включать EHCache или что-то более простое (если это было маленькое приложение, и мне не особо важна производительность параллелизма) в коде входа в систему.

Для каждого IP-адреса вы можете хранить счетчик ошибок и отметку времени.

  • Каждый раз, когда вы делаете попытку входа в систему, проверяйте, разрешено ли им использовать счетчик ошибок и отметку времени.
  • Каждый раз, когда вы делаете попытку входа в систему и неудачу, увеличивайте счетчик неудач на 1 и записывайте время неудачи.
  • Каждый раз, когда вы делаете попытку входа в систему и успешно завершаете очистку информации для этого IP.
0 голосов
/ 19 января 2009

Как насчет экспоненциального увеличения времени между попытками входа в систему?

0 голосов
/ 19 января 2009

Я использовал поле количества попыток входа в систему с данными пользователя. Когда он достигает 50, правильные пароли отклоняются, и пользователь должен выполнить сброс пароля.

...