Как активировать входные данные в 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 для продолжения.