작년쯤 처음이자 마지막으로 SQL Injection 공격을 받은 후에 보안에 대한 중요성을 다시한번 느끼게 되었다.

웹 애플리케이션을 개발할 때 SQL Injection과 XSS(크로스 사이트 스크립팅) 공격을 방지하는 것은 필수적인 보안 조치다.
이번 글에서는 Java에서 이러한 보안 취약점을 방지하기 위한 SecurityUtil 클래스를 구현하고, 직접 JAR 파일을 라이브러리로 추가하는 방식까지 확인해보자.


1. SecurityUtil 클래스

아래 코드는 SQL Injection과 XSS 공격을 방지하기 위한 유틸리티 클래스다.

import org.owasp.encoder.Encode;
import java.util.regex.Pattern;

public class SecurityUtil {
    // SQL Injection을 방지하기 위한 정규식 패턴
    private static final Pattern SQL_INJECTION_PATTERN = Pattern.compile(
            "(?i)(select|insert|update|delete|drop|alter|truncate|exec|union|--|#|;|\\'|\"|")
    );

    /**
     * SQL Injection 방지를 위한 입력값 검증
     * @param input 사용자 입력값
     * @return 안전한 값 (위험할 경우 null 반환)
     */
    public static String sanitizeSQLInput(String input) {
        if (input == null || SQL_INJECTION_PATTERN.matcher(input).find()) {
            return null; // 의심스러운 경우 차단
        }
        return input;
    }

    /**
     * XSS 방지를 위한 HTML Encoding
     * @param input 사용자 입력값
     * @return 안전한 HTML 인코딩된 문자열
     */
    public static String sanitizeXSS(String input) {
        return (input == null) ? null : Encode.forHtml(input);
    }

    /**
     * SQL Injection 및 XSS를 모두 검사하고 필터링
     * @param input 사용자 입력값
     * @return 안전한 값 (SQL Injection 감지 시 null 반환, XSS는 HTML Encoding)
     */
    public static String sanitize(String input) {
        String safeSQL = sanitizeSQLInput(input);
        return (safeSQL == null) ? null : sanitizeXSS(safeSQL);
    }
}

2. 코드 설명

2.1 SQL Injection 방지 (santitizeSQLInput)

- 정규식을 사용하여 select, insert, update, delete, drop, alter 등의 SQL 키워드와 --, #, ;, ', " 등의 특수 문자를 포함하는 문자열을 차단
- 입력값에 이러한 요소가 포함되어 있으면 null을 반환하여 실행을 방지

 

2.2 XSS 방지 (sanitizeXSS)

- OWASP Encoder 라이브러리의 Encode.forHtml(input)을 사용하여 HTML 인코딩을 수행
- <, >, ", ', & 등의 특수 문자를 HTML 엔터티로 변환하여 브라우저에서 악성 스크립트가 실행되지 않도록 방지

 

2.3 SQL Injection + XSS 종합 필터링 (sanitize)

- sanitizeSQLInput을 먼저 실행하여 SQL Injection을 검
- SQL Injection이 감지되지 않으면, sanitizeXSS를 실행하여 HTML 인코딩을 수행

3. OWASP Encoder 라이브러리 사용 방법

3.1 OWASP Encoder JAR 파일 직접 추가 (Maven, Gradle 미사용)

Maven이나 Gradle을 사용하지 않는 경우, JAR 파일을 직접 다운로드하여 프로젝트에 추가할 수 있다.
OWASP Java Encoder 프로젝트 페이지에서 최신 버전의 JAR 파일을 다운로드한다. (필자는 1.2.3 버전 사용)
다운로드한 JAR 파일을 프로젝트의 WEB-INF/lib 디렉토리에 저장 후 컴파일 시 클래스패스에 해당 JAR 파일을 포함하여 빌드한다.

encoder-1.2.3.jar
0.04MB

 

3.2 JAR 파일을 CLASSPATH에 추가하는 방법

JAR 파일을 수동으로 추가한 경우, Java 컴파일 및 실행 시 -cp 옵션을 사용해야한다.

javac -cp ".;lib/owasp-encoder.jar" SecurityUtil.java
java -cp ".;lib/owasp-encoder.jar" SecurityUtil

 


반응형