Heim  >  Artikel  >  Backend-Entwicklung  >  So überprüfen Sie, ob die Eingabe ein gültiges HTML-Tag in Golang ist

So überprüfen Sie, ob die Eingabe ein gültiges HTML-Tag in Golang ist

王林
王林Original
2023-06-24 08:11:171230Durchsuche

Go-Sprache ist eine schnelle, effiziente und stark typisierte Programmiersprache, die in der Entwicklung von Netzwerkdiensten, Cloud Computing, Datenwissenschaft, Internetfinanzen und anderen Bereichen weit verbreitet ist. Die Eingabevalidierung ist ein sehr wichtiges Thema bei der Entwicklung von Webanwendungen und es ist eine häufige Anforderung, zu überprüfen, ob die HTML-Tags in der Eingabe gültig sind. Im Folgenden stellen wir vor, wie diese Anforderung in der Go-Sprache implementiert wird.

HTML-Tags spielen in Webseiten eine wichtige Rolle. Sie definieren die Struktur, den Stil und das interaktive Verhalten der Seite. Bei der Verarbeitung von Benutzereingaben müssen wir jedoch auf das Risiko achten, dass HTML-Tags missbraucht werden, beispielsweise durch potenzielle XSS-Angriffe (Cross-Site-Scripting-Angriffe) und andere Sicherheitsprobleme. Daher überprüfen einige Anwendungen, ob die Eingabe schädliche oder illegale Tags enthält, um die Sicherheit und Zuverlässigkeit der Seite zu gewährleisten. Im Folgenden stellen wir vor, wie Sie überprüfen können, ob die Eingabe ein gültiges HTML-Tag in der Go-Sprache ist.

Die erste Methode besteht darin, die native Bibliothek von Go zu verwenden. Wir können die Funktion html.Parse verwenden, um den HTML-Code in einen Knotenbaum zu analysieren und dann den Typ und die Attribute des Knotens zu überprüfen. Hier ist ein Beispielcode:

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
}

Im obigen Code verwenden wir zunächst die Funktion html.Parse, um den eingegebenen HTML-Code in einen Knotenbaum zu analysieren. Dann durchlaufen Sie jeden Knoten. Wenn der Knotentyp ElementNode ist, müssen Sie den Labelnamen und die Attribute des Knotens überprüfen. In diesem Beispiel erlauben wir nur 3499910bf9dac5ae3c52d5ede7383485, 907fae80ddef53131f3292ee4f81644b, 8e99a69fbe029cd4e2b854e244eab143 und <img&gt ;-Tag, gibt false zurück, wenn andere Tags gefunden werden. Bei zulässigen Tags müssen wir auch prüfen, ob sie die erforderlichen Attribute enthalten. Beispielsweise muss das 3499910bf9dac5ae3c52d5ede7383485-Tag den href und den title-Attribute und das <code>a1f02c36ba31691bcfe87b2722de723b-Tag muss die Attribute src, alt und title enthalten Attribute. Bei der Überprüfung von Attributen können wir die Funktion enthältAttribute verwenden, die einen Knoten und eine Liste von Attributen akzeptiert und prüft, ob der Knoten alle angegebenen Attribute enthält. 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

Die zweite Methode besteht darin, eine Bibliothek eines Drittanbieters zu verwenden. Einige Bibliotheken von Drittanbietern in der Go-Sprache können uns dabei helfen, die HTML-Tags in der Eingabe einfacher zu überprüfen, z. B. github.com/microcosm-cc/bluemonday und github. com/theplant/htmlsanitizer. Diese Bibliotheken stellen einige einfache APIs bereit, mit denen wir problemlos Whitelists oder Blacklists definieren und Tags herausfiltern können, die die Anforderungen nicht erfüllen. Das Folgende ist beispielsweise ein Beispielcode, der die bluemonday-Bibliothek verwendet:

rrreee

Im obigen Code definieren wir zunächst eine Standardsicherheitsrichtlinie (bluemonday.StrictPolicy()) und verwenden dann die Funktion „policy.Sanitize“, um den Eingabe-HTML zu filtern Code. Gemäß der Standardsicherheitsrichtlinie erlauben wir das Tag 907fae80ddef53131f3292ee4f81644b, andere Tags jedoch nicht. Da bluemonday einen höheren Grad an Anpassung unterstützt, können wir darauf basierend unsere eigene Sicherheitsrichtlinie definieren. Informationen zur spezifischen Verwendung finden Sie in der Dokumentation. 🎜🎜Stellen Sie sicher, dass die Benutzereingabe ein gültiges HTML-Tag ist. Dies ist eine häufige und wichtige Anforderung. Das Obige stellt kurz vor, wie Sie native Go-Bibliotheken und Bibliotheken von Drittanbietern verwenden, um diese Anforderung zu erfüllen. Ich hoffe, dass es für Sie hilfreich ist. 🎜

Das obige ist der detaillierte Inhalt vonSo überprüfen Sie, ob die Eingabe ein gültiges HTML-Tag in Golang ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn