사용하기 쉬운 CSRF 크로스 스테이션 요청 위조 도구 클래스
18930 단어 SpringBoot 프레임안전 보호SQL 주입
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도 합법적인 도메인 이름으로 사용할 수 있음을 나타냅니다.