Nano Hash - криптовалюты, майнинг, программирование

Как заблокировать или ограничить множественный вызов действия Struts (граббер)

У меня есть приложение Struts2/Spring, и я хотел бы знать, как заблокировать «грабберы».

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

Как я могу остановить несколько вызовов одних и тех же действий и свести к минимуму обращения к базе данных?

Например, граббер вызывает одно и то же действие более 40 раз в минуту.


С точки зрения безопасности я думаю, что мне следует использовать кеш для хранения IP-адресов и номеров звонков и блокировать IP-адрес, если они превышают лимит.

Но я не знаю, как это сделать.

Если вы уже сделали то же самое, не могли бы вы рассказать мне, как реализовать решение?

14.06.2016

  • Это вы можете сделать. Используя перехватчик в struts2 каждый раз, когда ответ приходит с одного и того же IP-адреса, затем перенаправляйте на страницу предупреждения. 15.06.2016
  • Прочитайте это: stackoverflow.com /questions/30726627/ . Затем внедрите свой перехватчик, проверив IP или что-то еще, и отфильтруйте нежелательные соединения. Обратите внимание, что, вероятно, вы могли бы сделать что-то и на уровне веб-сервера, попробуйте спросить об этом своего администратора, если он у вас есть. 15.06.2016
  • Можно ли реализовать решение с кэшированием, таким как Guava или Ehcache, и определить срок действия для каждой записи в кеше? А как проверить номер звонка за 10 минут например? Спасибо 15.06.2016
  • Наличие капчи — самое простое решение. Отключить другие панели, когда капча на экране. 15.06.2016
  • @ParthTrivedi, у вас есть простой способ реализовать капчу с помощью Struts2, например, когда действие struts вызывается слишком много раз за 10 минут? Спасибо 15.06.2016
  • Попробуйте использовать Google API для ввода капчи с именем recaptcha. 15.06.2016
  • @ParthTrivedi в моем приложении, я хотел бы защитить некоторые URL-адреса, которые не содержат html-формы. Его действие возвращает данные json. Например, я хотел бы показать капчу, когда IP-адрес вызывает действие более 40 раз за 10 минут, например, но я не знаю, как это сделать. 15.06.2016
  • Попробуйте реализовать перехватчик, который анализирует заголовок HTTPRequest, получает удаленный адрес и подсчитывает его. Если оно больше порогового значения, перехватите его. Или покажите ему правильное сообщение на экране или таймере. 15.06.2016
  • @ParthTrivedi, чтобы подсчитать это, мне нужно было хранить IP-адрес и URL-адрес или имя действия в кеше или другом месте? Не могли бы вы привести пример реализации этого решения? 15.06.2016
  • Либо слишком много возможных ответов, либо хорошие ответы будут слишком длинными для этого формата. Пожалуйста, добавьте детали, чтобы сузить набор ответов или выделить проблему, на которую можно ответить в нескольких абзацах. 16.06.2016

Ответы:


1

Если вы используете struts2 и spring вместе, вам следует проверить функцию Spring Security по ограничению попыток пользователей. Если попытка пользователя не удалась 3 раза, пользователь должен быть заблокирован и не иметь доступа к странице, а если попыток меньше 3, мы должны сбросить счетчик. Также токен csrf следует использовать по-разному для каждой попытки входа в систему.

Весенняя безопасность

Взгляните на эту реализацию.

Основные файлы: LimitLoginAuthenticationProvider.java.

package com.mkyong.web.handler;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.LockedException;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;

import com.mkyong.users.dao.UserDetailsDao;
import com.mkyong.users.model.UserAttempts;

@Component("authenticationProvider")
public class LimitLoginAuthenticationProvider extends DaoAuthenticationProvider {

@Autowired
UserDetailsDao userDetailsDao;

@Autowired
@Qualifier("userDetailsService")
@Override
public void setUserDetailsService(UserDetailsService userDetailsService) {
    super.setUserDetailsService(userDetailsService);
}

@Override
public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException {

  try {

    Authentication auth = super.authenticate(authentication);

    //if reach here, means login success, else an exception will be thrown
    //reset the user_attempts
    userDetailsDao.resetFailAttempts(authentication.getName());

    return auth;

  } catch (BadCredentialsException e) { 

    //invalid login, update to user_attempts
    userDetailsDao.updateFailAttempts(authentication.getName());
    throw e;

  } catch (LockedException e){

    //this user is locked!
    String error = "";
    UserAttempts userAttempts = 
                userDetailsDao.getUserAttempts(authentication.getName());

           if(userAttempts!=null){
        Date lastAttempts = userAttempts.getLastModified();
        error = "User account is locked! <br><br>Username : " 
                       + authentication.getName() + "<br>Last Attempts : " + lastAttempts;
    }else{
        error = e.getMessage();
    }

  throw new LockedException(error);
}

}

}

Struts2

То же самое можно сделать, внедрив перехватчик в struts2.

public class MyAction implements SessionAware {
private Map<String, Object> session;

@Override
public String execute() {
    if (session.containsKey("loginAttempts")) {
        Integer loginAttempts = (Integer) session.get("loginAttempts");
        if (loginAttempts > 3) {
            //block user
        } else {
            session.put("loginAttempts", loginAttempts+1);
        }
    }
}

@Override
public void setSession(Map<String, Object> session) {
    this.session = session;
}
}

то же самое с перехватчиком

public String intercept (ActionInvocation invocation) throws Exception {
// Get the action context from the invocation so we can access the
// HttpServletRequest and HttpSession objects.
final ActionContext context = invocation.getInvocationContext ();
HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
HttpSession session =  request.getSession (true);

// Is there a "user" object stored in the user's HttpSession?
Object user = session.getAttribute (USER_HANDLE);
if (user == null) {
    // The user has not logged in yet.

    // Is the user attempting to log in right now?
    String loginAttempt = request.getParameter (LOGIN_ATTEMPT);
    if (! StringUtils.isBlank (loginAttempt) ) { // The user is attempting to log in.

        // Process the user's login attempt.
        if (processLoginAttempt (request, session) ) {
            // The login succeeded send them the login-success page.
            return "login-success";
        } else {
            // The login failed. Set an error if we can on the action.
            Object action = invocation.getAction ();
            if (action instanceof ValidationAware) {
                ((ValidationAware) action).addActionError ("Username or password incorrect.");
            }
        }
    }

    // Either the login attempt failed or the user hasn't tried to login yet, 
    // and we need to send the login form.
    return "login";
} else {
    return invocation.invoke ();
}
}

Вы также можете использовать Recaptcha после 3 неудачных попыток или сбросить пароль.

С точки зрения безопасности вы должны сделать немного больше. Например, используйте кеш для хранения IP-адресов и попыток входа в систему и заблокируйте IP-адрес, если они израсходовали все попытки входа в систему. С помощью Spring и Guavas кеш с автоматическим истечением срока действия легко реализовать с помощью expireAfterWrite(10, TimeUnit.MINUTES).

Если вы хотите хранить/кешировать только IP-адрес и считать его парой значений ключа, Spring Radis также хорошая альтернатива в Spring Framework.

17.06.2016
  • Спасибо за этот образец кода, он очень полезен. Но не могли бы вы дать мне образец, чтобы сделать это с кешем с автоматическим истечением срока действия Guavas? Меня очень интересует этот момент. 22.06.2016
  • ImmutableSortedSet‹Integer› set = ContiguousSet.create(Range.open(1, 5), DiscreteDomain.integers()); // множество содержит [2, 3, 4] ContiguousSet.create(Range.greaterThan(0), DiscreteDomain.integers()); // набор содержит [1, 2, ..., Integer.MAX_VALUE] 22.06.2016
  • Вот это глобальное время истечения срока действия кеша нет? возможно ли иметь ttl для каждой записи? Я пытаюсь сделать это с помощью ehcache, но срок действия моего элемента в кеше никогда не истекает. И с вашим образцом struts2, где я могу его использовать? и что такое «МОЙ_СЛУШАТЕЛЬ»? 22.06.2016
  • Для ттл expireAfterWrite(10, TimeUnit.MINUTES). Но используете ли вы ehcache? 22.06.2016
  • Вы можете указать прослушиватель удаления для вашего кеша, чтобы выполнить некоторую операцию, когда запись удалена, через CacheBuilder.removalListener(RemovalListener). RemovalListener передается RemovalNotification, который указывает RemovalCause, ключ и значение. Для целей регистрации исключения на этой странице есть пример. 22.06.2016
  • Да, на самом деле я использую ehcache, потому что он уже есть в моем веб-приложении. 22.06.2016
  • В ehcache я не могу использовать параметр TTL для установки даты истечения срока действия попыток входа в систему из-за обновления элемента в кеше, сбрасывающего TTL. Если кто-нибудь знает возможность обновить элемент в ehcache без изменения предыдущего TTL, это будет очень полезно для меня. На самом деле я делаю разницу с датой создания и датой, когда приходит новая попытка. 24.06.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..