반응형

웹 애플리케이션에서 해킹을 방지하기 위해 HTML 필터링은 매우 중요합니다. 이는 주로 Cross-Site Scripting(XSS) 공격을 방지하기 위한 것입니다. HTML 필터링은 사용자가 입력한 데이터에서 악성 스크립트를 제거하거나 인코딩하여 실행되지 않도록 합니다.

아래는 HTML 필터링을 적용하는 방법에 대한 자세한 설명과 예제입니다.


1. XSS 방지 필터링의 원리

  • 사용자 입력에서 위험한 HTML 태그와 속성을 제거하거나, 안전하게 변환(escape)합니다.
  • HTML 엔티티 인코딩을 통해 스크립트 실행을 방지합니다.
    • 예: <script> → &lt;script&gt;
  • 검증된 화이트리스트 기반으로 허용된 태그만 통과시킵니다.

2. HTML 필터링 라이브러리 사용 예제

1) OWASP Java HTML Sanitizer

OWASP에서 제공하는 HTML Sanitizer는 안전한 HTML 필터링을 제공합니다.

의존성 추가(Maven):

<dependency>
    <groupId>org.owasp</groupId>
    <artifactId>owasp-java-html-sanitizer</artifactId>
    <version>20211018.1</version>
</dependency>

코드 예제:

import org.owasp.html.HtmlPolicyBuilder;
import org.owasp.html.PolicyFactory;

public class HtmlFilterExample {
    public static void main(String[] args) {
        // 허용된 태그와 속성을 정의
        PolicyFactory policy = new HtmlPolicyBuilder()
                .allowElements("b", "i", "u", "a", "p", "br", "ul", "li")
                .allowAttributes("href").onElements("a")
                .toFactory();

        // 사용자 입력(악성 스크립트 포함)
        String userInput = "<script>alert('Hacked!');</script><p>Welcome to <b>my site</b></p>";

        // 필터링된 출력
        String safeHtml = policy.sanitize(userInput);

        System.out.println("Filtered HTML: " + safeHtml);
    }
}

출력 결과:

Filtered HTML: <p>Welcome to <b>my site</b></p>

2) Apache Commons Text를 사용한 HTML 이스케이핑

Apache Commons Text는 HTML 이스케이핑 기능을 제공합니다.

의존성 추가(Maven):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.10.0</version>
</dependency>

코드 예제:

import org.apache.commons.text.StringEscapeUtils;

public class HtmlEscapeExample {
    public static void main(String[] args) {
        // 사용자 입력
        String userInput = "<script>alert('Hacked!');</script><p>Safe content</p>";

        // HTML 이스케이핑
        String escapedHtml = StringEscapeUtils.escapeHtml4(userInput);

        System.out.println("Escaped HTML: " + escapedHtml);
    }
}

출력 결과:

Escaped HTML: &lt;script&gt;alert(&#39;Hacked!&#39;);&lt;/script&gt;&lt;p&gt;Safe content&lt;/p&gt;

3. 직접 HTML 필터링 구현

Java로 간단한 HTML 필터링 로직 구현

public class CustomHtmlFilter {
    public static String sanitize(String input) {
        if (input == null) {
            return null;
        }

        // 금지된 태그를 제거
        input = input.replaceAll("(?i)<script.*?>.*?</script>", ""); // <script> 태그 제거
        input = input.replaceAll("(?i)<style.*?>.*?</style>", "");   // <style> 태그 제거
        input = input.replaceAll("(?i)<.*?>", "");                  // 나머지 HTML 태그 제거

        // 특수 문자 인코딩
        input = input.replace("&", "&amp;");
        input = input.replace("<", "&lt;");
        input = input.replace(">", "&gt;");
        input = input.replace("\"", "&quot;");
        input = input.replace("'", "&#39;");

        return input;
    }

    public static void main(String[] args) {
        // 사용자 입력
        String userInput = "<script>alert('Hacked!');</script><b>Welcome</b> to <i>my site</i>";

        // 필터링된 결과
        String safeOutput = sanitize(userInput);

        System.out.println("Sanitized Output: " + safeOutput);
    }
}

출력 결과:

Sanitized Output: Welcome to my site

4. HTML 필터링 적용 시 주의사항

  1. 화이트리스트 기반 접근:
    • 반드시 허용할 태그와 속성만 정의하고 나머지는 차단해야 합니다.
    • 예: <a href="...">는 허용, <script>는 차단.
  2. 검증된 라이브러리 사용:
    • 직접 구현은 실수로 인해 보안 취약점을 만들 수 있으므로 OWASP나 Apache Commons와 같은 검증된 라이브러리를 사용합니다.
  3. 특수 문자 인코딩:
    • 사용자 입력을 HTML에 직접 출력하기 전에 반드시 이스케이핑 처리를 해야 합니다.
  4. 입력 검증과 출력 검증 병행:
    • 입력 시 필터링을 통해 악성 입력을 제거하고, 출력 시에도 추가적인 이스케이핑을 적용합니다.

5. 전자정부프레임워크와 연계

전자정부프레임워크에서 HTML 필터링은 Spring Security의 **Content Security Policy(CSP)**와 함께 사용하면 더욱 강력한 보안을 제공합니다.

Spring Security에서 XSS 필터 설정

import org.springframework.context.annotation.Bean;
import org.springframework.security.web.firewall.HttpFirewall;
import org.springframework.security.web.firewall.StrictHttpFirewall;

@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowUrlEncodedSlash(true);
    return firewall;
}

위 설정과 함께 HTML 필터링 로직을 적용하면 안전한 웹 애플리케이션을 구현할 수 있습니다.

반응형

+ Recent posts