Maison  >  Article  >  développement back-end  >  Comment vérifier si l'entrée est une balise HTML valide dans Golang

Comment vérifier si l'entrée est une balise HTML valide dans Golang

王林
王林original
2023-06-24 08:11:171230parcourir

Le langage Go est un langage de programmation rapide, efficace et fortement typé, largement utilisé dans le développement de services réseau, le cloud computing, la science des données, la finance Internet et d'autres domaines. La validation des entrées est une question très importante dans le développement d'applications Web, et il est courant de vérifier si les balises HTML de l'entrée sont valides. Ci-dessous, nous présenterons comment implémenter cette exigence dans le langage Go.

Les balises HTML jouent un rôle important dans les pages Web. Elles définissent la structure, le style et le comportement interactif de la page. Mais lors du traitement des entrées des utilisateurs, nous devons prêter attention au risque d'utilisation abusive des balises HTML, comme par exemple des attaques XSS potentielles (attaques de script intersite) et d'autres problèmes de sécurité. Par conséquent, certaines applications vérifient si l'entrée contient des balises malveillantes ou illégales pour garantir la sécurité et la fiabilité de la page. Ci-dessous, nous expliquerons comment vérifier si l'entrée est une balise HTML valide dans le langage Go.

La première méthode consiste à utiliser la bibliothèque native de Go. Nous pouvons utiliser la fonction html.Parse pour analyser le code HTML dans une arborescence de nœuds, puis vérifier le type et les attributs du nœud. Voici un exemple de code :

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
}

Dans le code ci-dessus, nous utilisons d'abord la fonction html.Parse pour analyser le code HTML d'entrée dans une arborescence de nœuds. Parcourez ensuite chaque nœud, et si le type du nœud est ElementNode, vous devez vérifier le nom et les propriétés de l'étiquette du nœud. Dans cet exemple, nous autorisons uniquement 3499910bf9dac5ae3c52d5ede7383485, 907fae80ddef53131f3292ee4f81644b, 8e99a69fbe029cd4e2b854e244eab143 et <img&gt ; tag, renvoie false si d'autres balises sont trouvées. Pour les balises autorisées, nous devons également vérifier si elles contiennent les attributs nécessaires. Par exemple, la balise 3499910bf9dac5ae3c52d5ede7383485 doit contenir le href et le title<.> , et la balise <code>a1f02c36ba31691bcfe87b2722de723b doit contenir les éléments src, alt et title. attributs. Lors de la vérification des attributs, nous pouvons utiliser la fonction containAttributes, qui accepte un nœud et une liste d'attributs et vérifie si le nœud contient tous les attributs spécifiés. 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

La deuxième méthode consiste à utiliser une bibliothèque tierce dans le langage Go peut nous aider à vérifier plus facilement les balises HTML dans l'entrée, comme github.com/microcosm-cc/bluemonday et github. com/theplant/htmlsanitizer. Ces bibliothèques fournissent des API simples qui nous permettent de définir facilement des listes blanches ou noires et de filtrer les balises qui ne répondent pas aux exigences. Par exemple, voici un exemple de code utilisant la bibliothèque bluemonday :

rrreee

Dans le code ci-dessus, nous définissons d'abord une politique de sécurité par défaut (bluemonday.StrictPolicy()), puis utilisons la fonction Policy.Sanitize pour filtrer le code HTML d'entrée. code. Conformément à la politique de sécurité par défaut, nous autorisons la balise 907fae80ddef53131f3292ee4f81644b mais pas les autres balises. Étant donné que bluemonday prend en charge un degré plus élevé de personnalisation, nous pouvons définir notre propre politique de sécurité sur cette base. Veuillez vous référer à sa documentation pour une utilisation spécifique. 🎜🎜Vérifiez que la saisie de l'utilisateur est une balise HTML valide, c'est un besoin courant et important. Ce qui précède présente brièvement comment utiliser les bibliothèques natives Go et les bibliothèques tierces pour répondre à cette exigence. J'espère que cela vous sera utile. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn