XSS, SQL 삽입 공격 방어 적용 방안

2. 18 오전 11:04

XSS(Cross(X)-Site Scripting) 및 SQL 삽입 공격에 대한 방어 Filter(불순 값 점검 Filter)를 적용한다.

불순 값 점검 Filter의 역할은, 불순한 의도를 가지고 요청하는 파라미터 값(사용자 의도와 상관없이 시행되게 하는 script(<script> 태그, onerror, onload 이벤트 처리 등) 및 불순한 의도로 동작하게 하는 SQL 삽입 파라미터)를 점검하는 것이다.

방어 Filter 내 처리방법은, 파라미터 값을 확인하여 허용되지 않은 패턴 값을 포함하고 있으면 통과시키지 않도록 한다.

다음은 적용 예시이다.

<!-- 불량 파라미터 값 점검 Filter -->
<filter>
  <filter-name>paramCheckFilter<filter-name>
  <filter-class>net.waglewagle.servlet.filter.ParamterCheckFilter</filter-class>

  <!-- 필터 검증 값 정규식 패턴(대소문자 구별하지 않음),
       한 줄에 하나씩 입력하고, 
       각 줄의 앞뒤 공백은 무시된다. -->
  <init-param>
    <param-name>pattern</param-name>
    <param-value><![CDATA[
      <script
      onerror
      onload
      1\s*=\s*1
    ]]></param-value>
  </init-param>

  <!-- 필터 검증 미통과시 응답 코드 -->
  <init-param>
    <param-name>reponse</param-name>
    <param-value>400</param-value>
  </init-param>

  <!-- 필터 검증 적용 기본 정책: 
      CHECK - 모두 검증 후 통과
      UNCHECK - 모두 검증없이 통과 -->
  <init-param>
    <param-name>policy</param-name>
    <param-value>CHECK</param-value>
  </init-param>

  <!-- 필터 검증 적용 기본 정책 예외 목록 -->
  <init-param>
    <param-name>excludeUrl</param-name>
    <param-value>
      [GET,HEAD]
      /membership/
      ?memberId&password
    </param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>paramCheckFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

필터 초기 파라미터

  • pattern: 값 점검 정규식 패턴.
    • 영문 대소문자는 구별하지 않는 패턴으로 쓰인다.
    • 한 줄에 하나씩 기록하며, 이 중 하나라도 해당되는 값인지 검증한다
    • 각 줄의 앞 뒤 공백은 삭제후 사용된다
  • response: 점검을 통과하지 못 했을 때 응답으로 보낼 HTTP 응답 코드
    • 기본값 400(Bad Request)
  • policy: CSRF 필터 검증 기본 정책
    • CHECK: 모든 요청에 대해 검증후 허용한다.
    • UNCHECK: 모든 요청에 대해 검증없이 허용한다.
  • excludeUrl: 검증 기본 정책의 예외
    • 한 줄에 하나씩 입력
      • 앞뒤 공백은 무시됩니다.
      • 나열한 목록에 하나라도 해당되면 예외로 인정됩니다.
    • 형식: {[메쏘드목록]}{URL패턴}?{파라미터들}
      • 예시
        • [GET,HEAD]: 요청 메쏘드가 GET 또는 HEAD인 요청
        • [POST]/member/login.do?a&b=v1
          • "/member/login.do" URL로 파라미터명 "a"가 있고, 파라미터 "b"의 값이 "v1"인 POST 요청
        • /member/login.do: "/member/login.do" 일치
        • /login.*: 확장자를 가진 "/login."으로 시작하는 URL
        • /a/**: "/a/"으로 시작하는 모든 URL
          • "/a/b", "/a/b.do", "/a/b/c.view", "/a/b/c.x" 등
      • {[메쏘드목록]}: (선택항목) 예외 메쏘드 목록. 대소문자는 구별하지 않는다.
      • {URL패턴}: 파라미터를 제외한 요청 URL 패턴
        • **: 경로 구분자(/)를 포함한 0번 이상의 모든 문자
        • *: 경로 구분자(/)를 제외한 0번 이상의 모든 문자
      • {파라미터들}: {파라미터명}={파라미터값들}, "&"로 구별하여 여러파라미터 가능
        • {파라미터명}: 알파벳으로 시직하는 알파펫과 숫자와 언더바(_), 대쉬(-)로 구성
        • {파라미터값들}: "^"를 구별자로 AND 조건. "|"를 구별자로 OR 조건. 동일 파라미터명을 여러 개 있는 경우 OR 조건.
          • a=1^2: 파라미터 "a" 값이 "1"과 "2"가 모두 있는 경우
          • a=1|2&a=3: 파라미터 "a" 값이 "1"이거나 "2" 또는 "3"인 경우