Как активировать входные данные в Java webapp?

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

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

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

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

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

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

Итак, что такое хороший способ реализовать дросселирование входа в Java?

Ответ 1

Я думаю, что даже 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

thats it man (до тех пор, пока код синхронизируется).

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Вы сохранили бы по IP, счету сбоя и метке времени.

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

Ответ 7

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