[go] HTML 태그 필터링

웹 애플리케이션에서 사용자 입력 필드에 HTML 태그를 허용하면 크로스 사이트 스크립팅 (XSS) 공격에 노출될 수 있습니다. 이 문제를 해결하기 위해 HTML 태그 필터링이 필요합니다.

필터링 방법

1. 특수 문자 이스케이프

HTML 태그를 허용하지 않는 대신, 사용자 입력에 포함된 모든 특수 문자를 이스케이프하여 HTML Entity로 변환합니다. 이를 통해 사용자 입력이 HTML 태그로 해석되지 않도록 할 수 있습니다.

package main

import (
    "html"
    "fmt"
)

func main() {
    userInput := "<script>alert('XSS')</script>"
    sanitizedInput := html.EscapeString(userInput)
    fmt.Println(sanitizedInput)
}

2. 허용할 태그 목록 지정

일부 HTML 태그를 사용자 입력에 허용하되, 다른 태그는 허용하지 않도록 하는 방법도 있습니다. 이를 위해 허용할 HTML 태그 목록을 만들고, 입력을 파싱하면서 이 목록에 속한 태그만 허용하고 다른 태그는 필터링할 수 있습니다.

package main

import (
    "golang.org/x/net/html"
    "bytes"
    "fmt"
)

func main() {
    userInput := "<strong>Hello</strong><script>alert('XSS')</script>"
    allowedTags := map[string]bool{"strong": true}
    
    tokenizedInput := html.NewTokenizer(bytes.NewReader([]byte(userInput)))
    
    var safeOutput bytes.Buffer
    for {
        tokenType := tokenizedInput.Next()
        if tokenType == html.ErrorToken {
            break
        }
        token := tokenizedInput.Token()
        if tokenType == html.StartTagToken || tokenType == html.EndTagToken {
            if allowedTags[token.Data] {
                safeOutput.WriteString(token.String())
            }
        }
    }
    fmt.Println(safeOutput.String())
}

결론

HTML 태그 필터링은 웹 애플리케이션에서 XSS 공격을 방지하는 데 중요한 역할을 합니다. 특수 문자 이스케이프와 허용할 태그 목록을 이용하여 사용자 입력을 안전하게 처리할 수 있습니다.

참고 문헌: