Существует 9 решений для предотвращения чистки интерфейса API. Какой из них вы предпочитаете?
Существует 9 решений для предотвращения чистки интерфейса API. Какой из них вы предпочитаете?

Привет, я брат Тиан

вчера,Интервью с другом,Вопрос от интервьюера:Что делать, если интерфейс запрошен злонамеренно?

Этот вопрос относительно открыт. Если он действительно неясен, вы можете представить, что бы вы сделали, если бы ваш интерфейс подвергся злонамеренной атаке, и просто четко изложите свои мысли (исходящее в том, что вы не можете говорить глупости, это должно быть разумно и разумно). логично).

В реальных проектах существует множество решений такого типа проблем. Вот вам 9 решений.

  1. брандмауэр:Конфигурациябрандмауэрправило,Ограничить частоту доступа и исходный IP-адрес API-интерфейса.,Предотвратите большое количество недействительных запросов.
  2. Проверочный код:нуждающийся в защитеинтерфейс Добавить Проверочный кодоверификация, которая требует от пользователей проведения Проверки перед доступом codeVerification, чтобы подтвердить, что он настоящий пользователь.
  3. Ограничения по IP:Ограничить доAPIинтерфейсдоступ ограничен определеннымиIPобъем,Например, разрешите IP-доступ только из интрасети или определенных партнеров.
  4. Ограничение частоты доступа к интерфейсу:Установить ограничения частоты доступа,Например, разрешено только определенное количество запросов в минуту/час/день.,При превышении лимита будет возвращено сообщение об ошибке или IP будет забанен.
  5. Аутентификация и авторизация пользователя:Требовать от пользователей доступаAPIинтерфейс Аутентификация перед,И авторизоваться в соответствии с правами пользователя,Только авторизованным пользователям разрешен доступ к определенному интерфейсу.
  6. Мониторинг журналов:мониторAPIинтерфейспосещатьбревно,Своевременно обнаруживайте аномальные запросы,Например, определенный IP-адрес часто запрашивает один и тот же интерфейс.,Своевременно принимайте соответствующие меры безопасности.
  7. Безопасное шифрование:Зашифрованная передача конфиденциальных данных,Используйте протокол HTTPS для обеспечения безопасности передачи данных.
  8. Использование API-шлюза:существоватьAPIинтерфейсвведенный междуAPIшлюз,Выполнение таких операций, как фильтрация, аутентификация и текущее ограничение запросов.,Защита внутреннего API-интерфейса.
  9. ручное вмешательство:Регулярный осмотрAPIинтерфейспосещать Состояние,Быстрое обнаружение аномального поведения,руководитьручное вмешательствоиметь дело с。

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

Этих 9 решений достаточно для интервьюеров, но многие люди все еще хотят увидеть, как их реализовать.

Вот три способа реализации антибрашинга:

  • Ограничения по IP
  • Мониторинг журналов
  • Установить ограничения частоты доступа。

Ограничение IP

В проекте Spring Boot ограничения IP могут быть достигнуты с помощью перехватчиков или фильтров. Ниже приведены конкретные этапы реализации:

  1. Создайте класс перехватчика или класс фильтра.,Реализуйте HandlerInterceptorинтерфейс или Filterинтерфейс.
  2. В реализации класса перехватчика или класса фильтра получите запрошенный IP-адрес.
  3. Конфигурация Список IP-адресов, которые необходимо ограничить,Эти IP-адреса можно сохранить в файле конфигурации.,Или определите список непосредственно в коде.
  4. В реализации класса перехватчика или класса фильтра определите, находится ли запрошенный IP-адрес в списке ограниченных IP-адресов. Если он есть в списке, продолжайте обработку запроса, в противном случае верните сообщение об ошибке или отклоните запрос.
  5. Весной В классе Конфигурация проекта Boot зарегистрируйте перехватчик или фильтр в приложении.

Вот пример кода, который использует перехватчик для реализации ограничений IP:

Язык кода:javascript
копировать
public class IPInterceptor implements HandlerInterceptor {
    private static final List<String> ALLOWED_IPS = Arrays.asList("127.0.0.1", "192.168.0.1");
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ipAddress = request.getRemoteAddr();
        
        if (ALLOWED_IPS.contains(ipAddress)) {
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            response.getWriter().write("Access denied");
            return false;
        }
        
        return true;
    }
}

Зарегистрируйте перехватчик в классе конфигурации проекта Spring Boot:

Язык кода:javascript
копировать
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new IPInterceptor());
    }
}

В приведенном выше примере,ALLOWED_IPSСписок содержит доступ, который не разрешенIPадрес,Если запрошенный IP-адрес есть в списке,затем вернись"Access denied"сообщение об ошибке,И установите код состояния ответа на403(Forbidden)

Аналогичным образом вы также можете использовать фильтры для реализации ограничений IP. Фильтры реализуются аналогичным образом, за исключением того, что вам необходимо реализовать интерфейс Filter и переопределить метод doFilter.

Обратите внимание, что в приведенном выше примере представлен только простой метод ограничения IP-адресов. Если вам нужна более сложная стратегия ограничения, вы можете рассмотреть возможность использования сторонних библиотек или платформ, таких как Spring Security.

Примечание. Здесь мы вписали IP-адрес в Java-код. В реальных проектах мы можем настроить его в файле конфигурации или использовать таблицу для его хранения, а затем каждый раз кэшировать данные в таблице в Redis. полученный непосредственно из redis. Помещение его в redis может снизить нагрузку на базу данных и напомнить о производительности интерфейса AIP.

Кроме того, вышеуказанные IP-адреса ограничивают доступ к тем IP-адресам, к которым нет доступа. Если наша система используется определенными пользователями, мы можем настроить этот список IP-адресов как доступные IP-адреса. Когда IP-адреса в списке не-IP доступны только мы можем. ограничьте это.

Мониторинг журналов

Чтобы внедрить Мониторинг журналов в API-интерфейс, вы можете выполнить следующие шаги:

  1. Внедрить систему ведения журналов:Весной В проекте загрузки,Обычно используйте slf4j в качестве бревно-фреймворка.,Вы можете добавить соответствующие зависимости в файл pom.xml проекта.
  2. Настроить вывод журнала:существоватьпроект Конфигурациядокумент(нравитьсяapplication.propertiesилиapplication.yml)середина,Настроить вывод Формат, уровень и другая сопутствующая информация журнала.
  3. Написание перехватчика запросов:проходить Написание перехватчика запросов,Кратковременно записывайте соответствующую информацию при вызове API-интерфейса. Вы можете получить запрошенный URL, параметры, метод запроса и другую информацию в перехватчике.,И запишите это бревно.
  4. Ведение журнала с использованием АОП:МожетпроходитьиспользоватьSpring AOP,Бревно ведение журнала при вызове APIинтерфейса. В аспекте АОП,Вы можете определить предварительные уведомления, пост-уведомления и т. д.,Бревно записи делаются в соответствующих уведомлениях по мере необходимости.
  5. Настроить хранилище журналов:может бытьбревно Хранить в базе данных、файлы или другие носители информации. Вы можете использовать связанные структуры хранения данных (например, logback).、log4j и т. д.) для конфигурации.
  6. Обработка исключений:существоватьAPIинтерфейс В случае злонамеренной чистки зубов,Может быть сгенерировано большое количество аномальных запросов. Это можно сделать, прописав глобальную Обработку исключений.,Единая обработка аномальных запросов,И записывайте соответствующую информацию.
  7. Мониторинг и анализ:Можно использоватьбревно Инструменты анализа(нравитьсяELK、Splunkждать)вернобревноруководитьв реальном временимонитори анализ,так что Своевременно обнаруживайте аномальные запросы。

Следует отметить, что,При внедрении журналов мониторинга,Необходимо соблюдать соответствующие законы и правила.,Обеспечьте личную конфиденциальность и безопасность данных.

Установить ограничения частоты доступа

В Spring Boot вы можете использовать перехватчики или фильтры для реализации ограничений частоты доступа к интерфейсам API. Эти два метода реализации представлены ниже.

  1. Используйте перехватчики для реализации ограничений частоты доступа.

Сначала создайте класс-перехватчик, реализуйте интерфейс HandlerInterceptor и переопределите метод preHandle. В методе preHandle вы можете ограничить запрос.

Язык кода:javascript
копировать
public class RateLimitInterceptor implements HandlerInterceptor {

    private final RateLimiter rateLimiter;

    public RateLimitInterceptor(RateLimiter rateLimiter) {
        this.rateLimiter = rateLimiter;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // Получить IP-адрес запроса
        String ipAddress = request.getRemoteAddr();
        
        // Проверьте, превышает ли IP-адрес лимит
        if (!rateLimiter.tryAcquire(ipAddress)) {
            response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
            response.getWriter().write("Too many requests");
            return false;
        }
        
        return true;
    }
}

Затем зарегистрируйте перехватчик в классе конфигурации:

Язык кода:javascript
копировать
@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final RateLimiter rateLimiter;

    public WebConfig(RateLimiter rateLimiter) {
        this.rateLimiter = rateLimiter;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new RateLimitInterceptor(rateLimiter));
    }
}
  1. Используйте фильтры, чтобы ограничить частоту доступа

Сначала создайте класс фильтра, реализуйте интерфейс javax.servlet.Filter и переопределите метод doFilter. В методе doFilter вы можете ограничить запрос.

Язык кода:javascript
копировать
public class RateLimitFilter implements Filter {

    private final RateLimiter rateLimiter;

    public RateLimitFilter(RateLimiter rateLimiter) {
        this.rateLimiter = rateLimiter;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // Получить IP-адрес запроса
        String ipAddress = httpRequest.getRemoteAddr();
        
        // Проверьте, превышает ли IP-адрес лимит
        if (!rateLimiter.tryAcquire(ipAddress)) {
            httpResponse.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
            httpResponse.getWriter().write("Too many requests");
            return;
        }

        chain.doFilter(request, response);
    }
}

Затем зарегистрируйте фильтр в классе конфигурации:

Язык кода:javascript
копировать
@Configuration
public class WebConfig {

    private final RateLimiter rateLimiter;

    public WebConfig(RateLimiter rateLimiter) {
        this.rateLimiter = rateLimiter;
    }

    @Bean
    public FilterRegistrationBean<RateLimitFilter> rateLimitFilter() {
        FilterRegistrationBean<RateLimitFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new RateLimitFilter(rateLimiter));
        registrationBean.addUrlPatterns("/api/*"); // Установить отфильтрованный URL-путь
        return registrationBean;
    }
}

В приведенном выше коде RateLimiter представляет собой собственный ограничитель тока. Вы можете выбрать подходящий метод реализации в соответствии с конкретными потребностями, например, использовать RaceLimiter Guava или использовать счетчик. Вы также можете использовать Redis для реализации этой технической функции.

Следует отметить, что,Приведенный выше код реализует только базовые ограничения частоты доступа.,На случай злонамеренной чистки интерфейса,Безопасность также может быть дополнительно повышена,примернравитьсяиспользоватьАлгоритм сегмента токеновПостоянное хранение IP-адресовждать。

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

Я все прочитала, поставьте палец вверх, Спасибо♪(・ω・)ノ

Рекомендации по статьям

ThreadLocal Принципы и проблемы, все в одном месте!

Журнал обновлений планеты【20231128】

Как программисты систематизируют знания?

Проект «Интернет вещей»: практика проекта «Зарядная куча»~

Полное интервью, брат Тиан защитит вас!

boy illustration
RasaGpt — платформа чат-ботов на основе Rasa и LLM.
boy illustration
Nomic Embed: воспроизводимая модель внедрения SOTA с открытым исходным кодом.
boy illustration
Улучшение YOLOv8: EMA основана на эффективном многомасштабном внимании, основанном на межпространственном обучении, и эффект лучше, чем у ECA, CBAM и CA. Малые цели имеют очевидные преимущества | ICASSP2023
boy illustration
Урок 1 серии Libtorch: Тензорная библиотека Silky C++
boy illustration
Руководство по локальному развертыванию Stable Diffusion: подробные шаги и анализ распространенных проблем
boy illustration
Полностью автоматический инструмент для работы с видео в один клик: VideoLingo
boy illustration
Улучшения оптимизации RT-DETR: облегченные улучшения магистрали | Support Paddle облегченный rtdetr-r18, rtdetr-r34, rtdetr-r50, rtdet
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | Деформируемое внимание с большим ядром (D-LKA Attention), большое ядро ​​​​свертки улучшает механизм внимания восприимчивых полей с различными функциями
boy illustration
Создано Datawhale: выпущено «Руководство по тонкой настройке развертывания большой модели GLM-4»!
boy illustration
7B превышает десятки миллиардов, aiXcoder-7B с открытым исходным кодом Пекинского университета — это самая мощная модель большого кода, лучший выбор для корпоративного развертывания.
boy illustration
Используйте модель Huggingface, чтобы заменить интерфейс внедрения OpenAI в китайской среде.
boy illustration
Оригинальные улучшения YOLOv8: несколько новых улучшений | Сохранение исходной информации — алгоритм отделяемой по глубине свертки (MDSConv) |
boy illustration
Второй пилот облачной разработки | Быстро поиграйте со средствами разработки на базе искусственного интеллекта
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция с нулевым кодированием и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
Решенная Ошибка | Загрузка PyTorch медленная: TimeoutError: [Errno 110] При загрузке факела истекло время ожидания — Cat Head Tiger
boy illustration
Brother OCR, библиотека с открытым исходным кодом для Python, которая распознает коды проверки.
boy illustration
Новейшее подробное руководство по загрузке и использованию последней демонстрационной версии набора данных COCO.
boy illustration
Выпущен отчет о крупной модели финансовой отрасли за 2023 год | Полный текст включен в загрузку |
boy illustration
Обычные компьютеры также могут работать с большими моделями, и вы можете получить личного помощника с искусственным интеллектом за три шага | Руководство для начинающих по локальному развертыванию LLaMA-3
boy illustration
Одной статьи достаточно для анализа фактора транскрипции SCENIC на Python (4)
boy illustration
Бросая вызов ограничениям производительности небольших видеокарт, он научит вас запускать большие модели глубокого обучения с ограниченными ресурсами, а также предоставит полное руководство по оценке и эффективному использованию памяти графического процессора!
boy illustration
Команда Fudan NLP опубликовала 80-страничный обзор крупномасштабных модельных агентов, в котором в одной статье представлен обзор текущего состояния и будущего агентов ИИ.
boy illustration
[Эксклюзив] Вы должны знать о новой функции JetBrains 2024.1 «Полнострочное завершение кода», чтобы решить вашу путаницу!
boy illustration
Краткое изложение базовых знаний о регистрации изображений 1.0
boy illustration
Новейшее подробное руководство по установке и использованию библиотеки cv2 (OpenCV, opencv-python) в Python.
boy illustration
Легко создайте локальную базу знаний для крупных моделей на основе Ollama+AnythingLLM.
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание решения. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Одна статья поможет вам понять RAG (Retrival Enhanced Generation) | Введение в концепцию и теорию + практику работы с кодом (включая исходный код).
boy illustration
Эволюция архитектуры шлюза облачной разработки
boy illustration
Docker и Kubernetes [Разработка контейнерных приложений с помощью Python]