사용하기 쉬운 CSRF 크로스 스테이션 요청 위조 도구 클래스

앞에서 설명한 바와 같이 최근 프로젝트에서 보안 테스트팀은 SQL 주입을 통해 백엔드 관리 시스템에 쉽게 로그인할 수 있음을 발견하여 CSRF 크로스 스테이션 요청 위조 기능을 추가하여 악의적인 로그인을 방지했다.다음은 코드 섹션입니다.


package com.faw.***.common.xss;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CSRFFilter implements Filter {
    private FilterConfig filterConfig = null;
    @Override
    public void destroy() {
        this.filterConfig = null;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("==  CSRF   ===");
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        //  http    Referer
        String referer = req.getHeader("Referer");
        //      referer   
        String myReferer = filterConfig.getInitParameter("referer");
        int count = 0;
        if (myReferer !=null){
            if (myReferer.trim().length() > 0) {
                String[] myReferers = myReferer.split(",");
                for (int i = 0; i < myReferers.length; i++) {
                    if (referer != null && !referer.trim().startsWith(myReferers[i])) {
                        count++;
                    } else {
                        chain.doFilter(request, response);
                        break;
                    }
                }
                if (count == myReferers.length) {
                    System.out.println("                  1:" + HttpServletResponse.SC_BAD_REQUEST);
                    resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
                    return;
                }
            }
        }

        System.out.println("==  CSRF   ===");
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }
}


도구 클래스가 완료되었습니다. 다음은 Filter 필터 구성 파일에 도구 클래스를 등록하여 사용하는 것입니다.

package com.faw.***.common.config;

import com.faw.***.common.xss.CSRFFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.DelegatingFilterProxy;
import com.google.common.collect.Maps;

import java.util.List;
import java.util.Map;

import javax.servlet.DispatcherType;

/**
 * Filter  
 */
@Configuration
public class FilterConfig {
    @Value("#{'${referer-domains}'}")	//  1
    private String domains;
    @Bean
    public FilterRegistrationBean csrfFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setDispatcherTypes(DispatcherType.REQUEST);
        registration.setFilter(new CSRFFilter());
        registration.addUrlPatterns("/*");
        registration.setName("csrfFilter");
        registration.setEnabled(true);
        Map<String, String> initParameters = Maps.newHashMap();
        initParameters.put("referer", domains);
        registration.setInitParameters(initParameters);
        registration.setOrder(Integer.MAX_VALUE-2);
        return registration;
    }
}


메모 1: 매개변수 domains는 메서드 initParameters입니다.put("referer",domains)는 사이트에 합법적으로 접근하는 도메인 이름을 제공합니다. @Value("#"${referer-domains}"}")는 응용 프로그램 프로필에서 설정 파라미터 값을 꺼내는 데 사용됩니다.본 프로젝트의 쓰기 방법은 다음과 같습니다. referer-domains: http://localhost,http://119.*.**.*** 본 컴퓨터의 IP도 사용할 수 있고 테스트 서버의 IP도 합법적인 도메인 이름으로 사용할 수 있음을 나타냅니다.

좋은 웹페이지 즐겨찾기