Java 는 SQL 이 XSS 스 크 립 트 를 주입 하 는 것 을 방지 하기 위해 필 터 를 사용 합 니 다.
정의 필터
package com.cn.unit.filter;
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 org.apache.commons.lang.StringUtils;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
/**
*
* Created by adonis on 2020/12/12
*/
public class SafeFilter implements Filter{
//
public FilterConfig filterConfig;
/**
*
* Servlet ,Filter WEB 。
* Web ,Web Filter , init , web.xml ,
* , 。
* Filter ,init 。
* init , Filter FilterConfig 。
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
filterConfig = config;
}
/**
*
* 。 URL ,Servlet doFilter 。
* FilterChain 。
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String enctype = httpRequest.getContentType();
if(StringUtils.isNotBlank(enctype) && enctype.contains("multipart/form-data")){
//
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
httpRequest.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = commonsMultipartResolver.resolveMultipart(httpRequest);
XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(multipartRequest);
chain.doFilter(xssRequest, response);
}else{
// Ajax
XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
chain.doFilter(xssRequest, response);
}
}
/**
*
* Filter , Web 。 Web Filter 。
* Filter 。 , 。
*/
@Override
public void destroy() {
this.filterConfig = null;
}
}
2.필터 포장 기,매개 변수 값 필터 실현
package com.cn.unit.filter;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
*
* Created by adonis on 2020/12/12
*/
public class SafeHttpServletRequestWrapper extends HttpServletRequestWrapper{
public SafeHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if (value != null) {
value = xssEncode(value);
}
return value;
}
@Override
public String[] getParameterValues(String name) {
String[] value = super.getParameterValues(name);
if(value != null){
for (int i = 0; i < value.length; i++) {
value[i] = xssEncode(value[i]);
}
}
return value;
}
@Override
public Map getParameterMap() {
return super.getParameterMap();
}
/**
*
*/
@Override
public String getHeader(String name) {
return super.getHeader(name);
}
/**
*
* @param value
* @return
*/
private static String xssEncode(String value) {
if (value == null || value.isEmpty()) {
return value;
}
// SQL
value = StringEscapeUtils.escapeSql(value);
// HTML ,
// 1. HTML (HtmlUtils , , , JSON )
value = HtmlUtils.htmlEscape(value);
/*
// 2. HTML (StringEscapeUtils , , )
// value = StringEscapeUtils.escapeHtml(value);
// 3. ( , replace )
value = value.replaceAll("<", "<");
value = value.replaceAll(">", ">");
value = value.replaceAll("'", "'");
value = value.replaceAll(";", "r");
value = value.replaceAll("&", "&");
value = value.replaceAll("%", "");
value = value.replaceAll("#", "#");
value = value.replaceAll("select", "seleᴄt");// "c"→"ᴄ"
value = value.replaceAll("truncate", "trunᴄate");// "c"→"ᴄ"
value = value.replaceAll("exec", "exeᴄ");// "c"→"ᴄ"
value = value.replaceAll("join", "jᴏin");// "o"→"ᴏ"
value = value.replaceAll("union", "uniᴏn");// "o"→"ᴏ"
value = value.replaceAll("drop", "drᴏp");// "o"→"ᴏ"
value = value.replaceAll("count", "cᴏunt");// "o"→"ᴏ"
value = value.replaceAll("insert", "ins℮rt");// "e"→"℮"
value = value.replaceAll("update", "updat℮");// "e"→"℮"
value = value.replaceAll("delete", "delet℮");// "e"→"℮"
value = value.replaceAll("script", "sᴄript");// "c"→"ᴄ"
value = value.replaceAll("cookie", "cᴏᴏkie");// "o"→"ᴏ"
value = value.replaceAll("iframe", "ifram℮");// "e"→"℮"
value = value.replaceAll("onmouseover", "onmouseov℮r");// "e"→"℮"
value = value.replaceAll("onmousemove", "onmousemov℮");// "e"→"℮"*/
return value;
}
}
3.웹 xml 필터 추가 설정
<!-- SQL XSS -->
<filter>
<filter-name>XssSqlFilter</filter-name>
<filter-class>com.cn.unit.filter.SafeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XssSqlFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
각 노드 에 대한 간단 한 설명 설정:노드 이름
소개 하 다.
필터 지정
필터 의 이름 을 지정 하 는 데 사용 합 니 다.이 요소 의 내용 은 비어 있 을 수 없습니다.
필터 의 전체 한정 클래스 이름 을 지정 합 니 다.
필터 에 초기 화 파 라 메 터 를 지정 합 니 다.필터 에 서 는 FilterConfig 인터페이스 대상 을 사용 하여 초기 화 매개 변수 에 접근 할 수 있 습 니 다.
필터 가 차단 하 는 자원 을 설정 합 니 다.Servlet 이름 이나 자원 에 접근 할 수 있 는 요청 경 로 를 지정 합 니 다.
하위 요 소 는 filter 의 등록 이름 을 설정 하 는 데 사 용 됩 니 다.이 값 은
filter 가 차단 한 요청 경 로 를 설정 합 니 다(필터 와 연 결 된 URL 스타일)
필터 가 차단 한 Servlet 이름 을 지정 합 니 다.
필터 가 차단 한 자원 을 Servlet 용기 에서 호출 하 는 방식 을 지정 합 니 다.기본 값 REQUEST
4.정적 자원 필터 건 너 뛰 기
실제 개발 과정 에서 js,css 등 정적 자원 도 여과 하여 서버 성능 을 소모 하기 때문에 여과 할 필요 가 없 는 필 터 를 직접 건 너 뛰 어 다음 과 같이 실현 합 니 다.
4.1 웹.xml 프로필 에 파 라 메 터 를 추가 하고 정적 자원 이 있 는 경 로 를 저장 합 니 다.
<init-param>
<param-name>excludeFilter</param-name><!-- , js、css -->
<param-value>/document/;/ligentres/</param-value>
</init-param>
그림:4.2 필터 초기 화 방법,정적 자원 이 있 는 경 로 를 읽 기
public FilterConfig filterConfig;
public String[] excludeFilterArray;
@Override
public void init(FilterConfig config) throws ServletException {
filterConfig = config;
// web
String excludeFilter = filterConfig.getInitParameter("excludeFilter");
excludeFilterArray = excludeFilter.split(";");
}
4.3 필터 차단 요청,정적 자원 이 있 는 경로 라면 필터 건 너 뛰 기
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String uri = httpRequest.getRequestURI();
// ,
if(uri==null||this.isContains(uri, excludeFilterArray)) {
chain.doFilter(request, response);
return;
}
......
}
//
public boolean isContains(String uri, String[] regx) {
boolean result = false;
for (int i = 0; i < regx.length; i++) {
if (uri.indexOf(regx[i]) != -1) {
return true;
}
}
return result;
}
대성 공이전 사람들의 경험 을 참고 하여 테스트 를 시작 할 때 일반적인 폼 제출 과 ajax 제출 은 인 자 를 걸 러 낼 수 있 지만 파일 을 업로드 할 때 필터 에 들 어 갈 수 없습니다.
나중에 연 구 를 통 해 파일 업로드 에 사용 되 는 MultipartResolver 를 처리 하고 요청 을 받 았 을 때 Dispatcher Servlet 의 checkMultipart()방법 은 MultipartResolver 의 isMultipart()방법 으로 요청 에 파일 이 포함 되 어 있 는 지 판단 합 니 다.요청 데이터 에 파일 이 포함 되 어 있 으 면 MultipartResolver 의 resolve Multipart()방법 으로 요청 한 데 이 터 를 분석 한 다음 파일 데 이 터 를 MultipartFile 로 분석 하여 MultipartHttpServletRequest 대상 에 봉 하여 마지막 으로 Controller 에 전달 합 니 다.따라서 필 터 를 정의 할 때 요청 헤드 를 가 져 와 파일 업로드 여 부 를 판단 하고 데 이 터 를 분석 하면 됩 니 다.
자바 가 필 터 를 사용 하여 SQL 이 XSS 스 크 립 트 에 주입 되 는 것 을 방지 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 필터 가 SQL 주입 내용 을 방지 하 는 것 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.