Привет, я брат Тиан
вчера,Интервью с другом,Вопрос от интервьюера:Что делать, если интерфейс запрошен злонамеренно?
Этот вопрос относительно открыт. Если он действительно неясен, вы можете представить, что бы вы сделали, если бы ваш интерфейс подвергся злонамеренной атаке, и просто четко изложите свои мысли (исходящее в том, что вы не можете говорить глупости, это должно быть разумно и разумно). логично).
В реальных проектах существует множество решений такого типа проблем. Вот вам 9 решений.
Короче говоря, в случае злонамеренной очистки интерфейса безопасность интерфейса можно повысить за счет ограничения частоты доступа, добавления кодов проверки, ограничений IP, аутентификации и авторизации личности пользователя и т. д.
Этих 9 решений достаточно для интервьюеров, но многие люди все еще хотят увидеть, как их реализовать.
Вот три способа реализации антибрашинга:
В проекте Spring Boot ограничения IP могут быть достигнуты с помощью перехватчиков или фильтров. Ниже приведены конкретные этапы реализации:
Вот пример кода, который использует перехватчик для реализации ограничений IP:
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:
@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-интерфейс, вы можете выполнить следующие шаги:
Следует отметить, что,При внедрении журналов мониторинга,Необходимо соблюдать соответствующие законы и правила.,Обеспечьте личную конфиденциальность и безопасность данных.
В Spring Boot вы можете использовать перехватчики или фильтры для реализации ограничений частоты доступа к интерфейсам API. Эти два метода реализации представлены ниже.
Сначала создайте класс-перехватчик, реализуйте интерфейс HandlerInterceptor и переопределите метод preHandle. В методе preHandle вы можете ограничить запрос.
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;
}
}
Затем зарегистрируйте перехватчик в классе конфигурации:
@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));
}
}
Сначала создайте класс фильтра, реализуйте интерфейс javax.servlet.Filter и переопределите метод doFilter. В методе doFilter вы можете ограничить запрос.
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);
}
}
Затем зарегистрируйте фильтр в классе конфигурации:
@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】
Как программисты систематизируют знания?