>  기사  >  백엔드 개발  >  입력이 golang의 유효한 HTML 태그인지 확인하는 방법

입력이 golang의 유효한 HTML 태그인지 확인하는 방법

王林
王林원래의
2023-06-24 08:11:171229검색

Go 언어는 빠르고 효율적이며 강력한 형식의 프로그래밍 언어로 네트워크 서비스 개발, 클라우드 컴퓨팅, 데이터 과학, 인터넷 금융 및 기타 분야에서 널리 사용됩니다. 입력 유효성 검사는 웹 애플리케이션 개발에서 매우 중요한 문제이며, 입력의 HTML 태그가 유효한지 확인하는 것은 일반적인 요구 사항입니다. 아래에서는 Go 언어에서 이 요구 사항을 구현하는 방법을 소개합니다.

HTML 태그는 웹페이지에서 중요한 역할을 하며 페이지의 구조, 스타일 및 대화형 동작을 정의합니다. 그러나 사용자 입력을 처리할 때 잠재적인 XSS 공격(크로스 사이트 스크립팅 공격) 및 기타 보안 문제와 같이 HTML 태그가 남용될 수 있는 위험에 주의해야 합니다. 따라서 일부 응용 프로그램에서는 페이지의 보안과 안정성을 보장하기 위해 입력에 악성 또는 불법 태그가 포함되어 있는지 확인합니다. 아래에서는 입력이 Go 언어에서 유효한 HTML 태그인지 확인하는 방법을 소개합니다.

첫 번째 방법은 Go의 기본 라이브러리를 사용하는 것입니다. html.Parse 함수를 사용하여 HTML 코드를 노드 트리로 구문 분석한 다음 노드의 유형과 속성을 확인할 수 있습니다. 다음은 샘플 코드입니다.

package main

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

func isValidHTMLTags(html string) bool {
    doc, err := html.Parse(strings.NewReader(html))
    if err != nil {
        fmt.Println(err)
        return false
    }
    for c := doc.FirstChild; c != nil; c = c.NextSibling {
        if c.Type == html.ElementNode {
            switch c.Data {
            case "a", "em", "strong":
                // 检查<a>、<em>、<strong>标签是否包含 href 和 title 属性
                if !containsAttributes(c, "href", "title") {
                    return false
                }
            case "img":
                // 检查<img>标签是否包含 src、alt、和 title 属性
                if !containsAttributes(c, "src", "alt", "title") {
                    return false
                }
            default:
                // 其他不允许的标签
                return false
            }
        }
    }
    return true
}

func containsAttributes(n *html.Node, attrs ...string) bool {
    for _, attr := range attrs {
        found := false
        for _, a := range n.Attr {
            if a.Key == attr {
                found = true
                break
            }
        }
        if !found {
            return false
        }
    }
    return true
}

func main() {
    html1 := "<p>Hello, <em>world!</em></p>"
    fmt.Println(isValidHTMLTags(html1))   // output: true

    html2 := "<script>alert('XSS');</script>"
    fmt.Println(isValidHTMLTags(html2))   // output: false

    html3 := "<a href='https://www.google.com' title='Google'>Google</a>"
    fmt.Println(isValidHTMLTags(html3))   // output: true

    html4 := "<img src='image.png' alt='Image' title='My image'/>"
    fmt.Println(isValidHTMLTags(html4))   // output: true

    html5 := "<audio src='music.mp3'></audio>"
    fmt.Println(isValidHTMLTags(html5))   // output: false
}

위 코드에서는 먼저 html.Parse 함수를 사용하여 입력 HTML 코드를 노드 트리로 구문 분석합니다. 그런 다음 각 노드를 반복하고 노드 유형이 ElementNode인 경우 노드의 레이블 이름과 속성을 확인해야 합니다. 이 예에서는 <a></a>, <em></em>, <strong></strong><img alt="입력이 golang의 유효한 HTML 태그인지 확인하는 방법" >만 허용됩니다. ; 태그, 다른 태그가 발견되면 false를 반환합니다. 허용된 태그의 경우 필요한 속성이 포함되어 있는지도 확인해야 합니다. 예를 들어 3499910bf9dac5ae3c52d5ede7383485 태그에는 hreftitle 속성, <code><img alt="입력이 golang의 유효한 HTML 태그인지 확인하는 방법" > 태그에는 src, alttitle이 포함되어야 합니다. 속성. 속성을 확인할 때 노드와 속성 목록을 받아들이고 노드에 지정된 모든 속성이 포함되어 있는지 확인하는 containAttributes 함수를 사용할 수 있습니다. 3499910bf9dac5ae3c52d5ede7383485907fae80ddef53131f3292ee4f81644b8e99a69fbe029cd4e2b854e244eab143a1f02c36ba31691bcfe87b2722de723b标签,如果发现其他标签则返回false。 对于被允许的标签,我们还需要检查它们是否包含必要的属性,例如3499910bf9dac5ae3c52d5ede7383485标签需要包含hreftitle属性,而a1f02c36ba31691bcfe87b2722de723b标签需要包含srcalttitle属性。在检查属性时,我们可以使用containsAttributes函数,该函数接受一个节点和一个属性列表,检查该节点是否包含所有指定的属性。

第二种方法是使用第三方库,Go语言中的一些第三方库可以帮助我们更轻松地验证输入中的HTML标签,例如github.com/microcosm-cc/bluemonday和github.com/theplant/htmlsanitizer。这些库提供了一些简单的API,使我们可以轻松地定义白名单或黑名单,并过滤掉不符合要求的标签。例如,下面是使用bluemonday库的示例代码:

package main

import (
    "fmt"
    "github.com/microcosm-cc/bluemonday"
)

func main() {
    html := "<p>Hello, <em>world!</em></p>"
    policy := bluemonday.StrictPolicy()
    sanitizedHTML := policy.Sanitize(html)
    fmt.Println(sanitizedHTML)   // output: <p>Hello, <em>world!</em></p>
}

上述代码中,我们首先定义了一个默认的安全策略(bluemonday.StrictPolicy()),然后使用policy.Sanitize函数过滤输入HTML代码。根据默认的安全策略,我们允许907fae80ddef53131f3292ee4f81644b

두 번째 방법은 타사 라이브러리를 사용하는 것입니다. Go 언어의 일부 타사 라이브러리는 github.com/microcosm-cc/bluemonday 및 github와 같이 입력의 HTML 태그를 더 쉽게 확인하는 데 도움이 될 수 있습니다. com/theplant/htmlsanitizer. 이러한 라이브러리는 화이트리스트 또는 블랙리스트를 쉽게 정의하고 요구 사항을 충족하지 않는 태그를 필터링할 수 있는 몇 가지 간단한 API를 제공합니다. 예를 들어, 다음은 bluemonday 라이브러리를 사용하는 샘플 코드입니다.

rrreee

위 코드에서는 먼저 기본 보안 정책(bluemonday.StrictPolicy())을 정의한 다음,policy.Sanitize 함수를 사용하여 입력 HTML을 필터링합니다. 암호. 기본 보안 정책에 따라 907fae80ddef53131f3292ee4f81644b 태그는 허용되지만 다른 태그는 허용되지 않습니다. bluemonday는 더 높은 수준의 사용자 정의를 지원하므로 이를 기반으로 자체 보안 정책을 정의할 수 있습니다. 구체적인 사용법은 해당 문서를 참조하세요. 🎜🎜사용자 입력이 유효한 HTML 태그인지 확인하세요. 이는 일반적이고 중요한 요구 사항입니다. 위 내용은 Go 네이티브 라이브러리와 타사 라이브러리를 사용하여 이 요구 사항을 충족하는 방법을 간략하게 소개한 내용입니다. 🎜

위 내용은 입력이 golang의 유효한 HTML 태그인지 확인하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.