Есть ли простой и эффективный способ отложить ответ от сервлета Java

Что я могу сделать, когда я получу очевидную попытку взлома? Хотелось бы, чтобы был простой способ заставить их тратить свое время, не задействуя ресурсы сервера. Даже задержка в несколько секунд может сделать бесполезными атаки грубой силы.

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

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

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

4 ответа

Решение

Я думаю, что если вы обнаружите дурацкую игру, было бы разумнее заблокировать их IP на определенный период. Было бы легко просто добавить их IP в /etc/hosts.deny (он работает для многих демонов Unix, но я не уверен, что он работает и с процессами Java, я думаю, что он должен работать, поскольку он используется самим демоном tcp). man 5 hosts.deny в командной строке дает некоторые подсказки (или проверьте эту онлайн-ссылку).

Кстати, я думаю, что вы можете использовать Thread.sleep() приостановить сервлет, как в любом обычном коде Java. Но это, вероятно, приведет к тому, что большее количество запросов от одного и того же абонента будет оставаться открытым в течение длительного времени, что приведет к увеличению активных ресурсов, которые сервер приложений должен выделять и обслуживать. Поэтому, если злоумышленник может работать в многопоточном режиме, возможно, это поможет ему заблокировать ваш сервер, поскольку он будет удерживать все потоки для своей атаки, блокируя доступ всех остальных пользователей к вашему сервису.

Если вы получаете подозрительно повторяющийся запрос с того же IP-адреса, вы можете ввести возрастающую задержку:

Thread.sleep(n);

Где n удваивает каждое последующее событие.

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

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

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

Скорее всего, хакеры не ждут ответа, поэтому вы не ударите их, отложив его.

использование nginx или уровень брандмауэра.

Другие вопросы по тегам