springboot 은 ehcache 와 결합 하여 악의 적 인 리 셋 요청 의 실현 을 방지 합 니 다.

설명 하 다.
우 리 는 개 발 된 사 이 트 를 접속 하기 전에 반드시 다른 사람 이 악의 적 으로 당신 의 홈 페이지 를 갱신 하 는 상황 을 고려 하여 최대한 그들 을 제한 해 야 합 니 다.그렇지 않 으 면 애플 리 케 이 션 서버 를 무 너 뜨 릴 수 있 습 니 다.어떤 악의 적 인 사용자 가 많은 육계 들 을 이용 하여 1 분 안에 웹 페이지 에 몇 십 만 번 을 요청 하 는 것 이 어떤 상황 인지 상상 해 보 세 요.
일부 내용 참조 네트워크.
어떤 효 과 를 내야 합 니까?
요청 한 사용 자 를 제한 합 니 다.방문 IP 에 따라 N 분 동안 단일 웹 페이지 를 요청 하 는 횟수 를 기록 합 니 다.N 번 을 초과 하면 이 IP 를 캐 시 블랙리스트 에 추가 하고 3 시간 동안 유형 웹 페이지 에 접근 할 수 없 도록 제한 합 니 다.
효과 도
1 분 동안 요청 서 홈 페이지 가 15 회 를 넘 으 면 블랙리스트 에 가입 하여 3 시간 동안 동결 합 니 다!
在这里插入图片描述
개발 절차
  • AOP+Ehcache 방식 을 사용 합 니 다.(Redis 도 가능 합 니 다)
  • AOP 는 차단 과 논리 적 판단 에 사용 되 고 Ehcache 는 계수 와 캐 시 를 책임 집 니 다
  • ehcache 설정
    생략
    주석 만 들 기
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @Documented
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public @interface RequestLimit {
      /**
       *          
       */
      int count() default 15;
    
      /**
       *    ,     ,      
       */
      long time() default 1000*60;
    }
    AOP 만 들 기
    
    @Aspect
    @Component
    public class RequestLimitAspect {
      private static final Logger logger = LoggerFactory.getLogger(RequestLimit.class);
    
      @Autowired
      EhcacheUtil ehcacheUtil;
    
      @Before("within(@org.springframework.stereotype.Controller *) && @annotation(limit)")
      public void requestLimit(final JoinPoint joinPoint , RequestLimit limit) throws RequestLimitException {
        try {
          Object[] args = joinPoint.getArgs();
          HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
          String ip = IpUtil.getRemoteIp(request);
          String uri = request.getRequestURI().toString();
          String key = "req_"+uri+"_"+ip;
          String blackKey = "black_"+ip; //    IP      
          int count = 0; //     
          //         
          if (ehcacheUtil.contains("countcache",blackKey)){
            throw new RequestLimitException();
          }else{
            //            
            if (!ehcacheUtil.contains("limitCache",key)) {
              ehcacheUtil.put("limitCache",key,1);
    
            } else {
              count = ehcacheUtil.getInt("limitCache",key)+1;
              ehcacheUtil.put("limitCache",key,count);
              if (count > limit.count()) {
                logger.info("  IP[" + ip + "]    [" + uri + "]        [" + limit.count() + "]");
                //      
                ehcacheUtil.put("countcache",blackKey,"badguy");
                throw new RequestLimitException();
              }
            }
          }
    
    
        }catch (RequestLimitException e){
          throw e;
        }catch (Exception e){
          logger.error("    ",e);
        }
      }
    }
    응용 op
    응용 할 인 터 페 이 스 를 찾 아서 주석@RequestLimit 을 추가 하면 됩 니 다.
    
     @RequestLimit(count=10)
      @OperLog(operModule = "    ",operType = "  ",operDesc = "      ")
      @GetMapping("/more/{categoryId}")
      public String getMore(@PathVariable("categoryId") String categoryId, Model model, HttpServletRequest request) {
        //  
      }
    springboot 와 ehcache 를 결합 하여 악의 적 인 리 셋 방지 요청 의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 springboot 의 악의 적 인 리 셋 방지 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기