Java 는 SQL 이 XSS 스 크 립 트 를 주입 하 는 것 을 방지 하기 위해 필 터 를 사용 합 니 다.

며칠 전에 한 고객 이 시스템 에 html 문 구 를 썼 는데 페이지 를 열 면 닭 볶 음 큰 그림 이 나 와 미관 에 영향 을 주 었 다.나중에 곰 곰 이 생각해 보 니 html 문구 만 주입 되 어 심각 성 을 알 게 된 후에 바로 시스템 안전 설정 을 시작 했다.
정의 필터

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 주입 내용 을 방지 하 는 것 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기