Develop/JAVA

[Java] 크로스 사이트 스크립트 (XSS) 취약점 조치방법

issuemaker99 2024. 10. 30. 16:44
728x90

크로스 사이트 스크립트 (XSS)란 무엇인가?

**크로스 사이트 스크립트(XSS)**는 공격자가 악성 스크립트를 웹 사이트에 삽입하여 사용자 브라우저에서 실행되게 하는 공격 방식입니다. 이로 인해 사용자의 세션, 쿠키, 로컬 스토리지 정보 등을 탈취할 수 있으며, 피싱, 키로깅 등의 악성 행위가 가능해집니다.

왜 XSS 취약점을 조치해야 하는가?

XSS 공격을 방치할 경우 사용자 데이터 유출, 계정 탈취, 악성 스크립트 실행 등의 보안 위험이 발생할 수 있습니다. 따라서 웹 애플리케이션에서는 XSS 취약점을 미리 방지하는 조치가 필요합니다.

XSS 방지 방법

Java에서는 다음과 같은 방법으로 XSS를 방지할 수 있습니다.

  1. 입력 값 검증: 사용자 입력을 검증하고 불필요한 특수 문자를 제거하여 안전하게 처리합니다.
  2. 출력 인코딩: HTML로 출력할 때 특수 문자를 인코딩하거나 필요한 경우 변환하여 안전하게 표시합니다.

Java에서 XSS 방지: replace를 이용한 문자 변환

replace 메서드를 사용하여 사용자 입력을 저장할 때 HTML 태그를 안전한 텍스트로 변환하고, 화면에 출력할 때는 원래 형태로 디코딩해 표시할 수 있습니다.

예제: replace를 사용한 문자 변환 및 복구

  1. 입력 값을 변환하여 저장하기
    사용자가 입력한 특수 문자를 안전하게 변환하여 서버에 저장합니다.
  2. 출력 시 원래 형태로 복구하기
    저장된 데이터를 화면에 표시할 때는 변환된 특수 문자를 원래 형태로 복구하여 표시합니다.

다음은 Java Spring 환경에서 replace를 이용해 XSS를 방지하는 예제입니다.

Controller 코드

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class XssPreventionController {

    // 특수 문자 변환 메서드 (입력값 처리용)
    private String sanitizeInput(String input) {
        return input.replace("<", "&lt;")
                    .replace(">", "&gt;")
                    .replace("&", "&amp;")
                    .replace("\"", "&quot;")
                    .replace("'", "&#x27;");
    }

    // 특수 문자 복구 메서드 (출력용)
    private String restoreOutput(String sanitizedInput) {
        return sanitizedInput.replace("&lt;", "<")
                             .replace("&gt;", ">")
                             .replace("&amp;", "&")
                             .replace("&quot;", "\"")
                             .replace("&#x27;", "'");
    }

    @GetMapping("/submit")
    public ModelAndView submitInput(@RequestParam("userInput") String userInput) {
        // 입력 값을 변환하여 저장
        String sanitizedInput = sanitizeInput(userInput);

        ModelAndView modelAndView = new ModelAndView("result");
        modelAndView.addObject("userInput", sanitizedInput);
        return modelAndView;
    }

    @GetMapping("/display")
    public ModelAndView displayInput(@RequestParam("storedInput") String storedInput) {
        // 저장된 값을 복구하여 화면에 표시
        String restoredInput = restoreOutput(storedInput);

        ModelAndView modelAndView = new ModelAndView("display");
        modelAndView.addObject("userInput", restoredInput);
        return modelAndView;
    }
}

 

위 예제에서는 sanitizeInput 메서드를 사용해 <, >, &, ", ' 등 XSS 공격에 사용될 수 있는 특수 문자를 변환하여 저장하고, restoreOutput 메서드를 통해 원래 형태로 복구하여 화면에 표시하도록 했습니다.

JSP 예제: 변환된 입력과 복구된 출력

submit 페이지에서 입력을 받으면 변환하여 저장하고, display 페이지에서는 복구된 값을 화면에 표시합니다.

  1. submit.jsp – 사용자 입력 받기
<form action="/submit" method="get">
    <label for="userInput">메시지를 입력하세요:</label>
    <input type="text" name="userInput" id="userInput">
    <button type="submit">제출</button>
</form>

 

2.   result.jsp – 변환된 입력을 확인하기

<h2>입력 결과:</h2>
<p>${userInput}</p>
<a href="/display?storedInput=${userInput}">원래 형태로 보기</a>

 

3.    display.jsp – 복구된 출력을 표시하기

<h2>복구된 입력 결과:</h2>
<p>${userInput}</p>

 

위 방식으로 replace 메서드를 사용해 입력값을 안전하게 변환하고 필요할 때 복구하여 보여줌으로써 XSS 공격을 방지할 수 있습니다.

 

LIST