Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengesahkan sama ada input adalah teg Html yang sah dalam golang

Bagaimana untuk mengesahkan sama ada input adalah teg Html yang sah dalam golang

王林
王林asal
2023-06-24 08:11:171230semak imbas

Bahasa Go ialah bahasa pengaturcaraan yang pantas, cekap dan ditaip kuat, yang digunakan secara meluas dalam pembangunan perkhidmatan rangkaian, pengkomputeran awan, sains data, kewangan Internet dan bidang lain. Pengesahan input ialah isu yang sangat penting dalam pembangunan aplikasi web, dan ia merupakan keperluan biasa untuk mengesahkan sama ada teg HTML dalam input adalah sah. Di bawah ini kami akan memperkenalkan cara melaksanakan keperluan ini dalam bahasa Go.

Teg HTML memainkan peranan penting dalam halaman Web. Mereka mentakrifkan struktur, gaya dan tingkah laku interaktif halaman. Tetapi apabila memproses input pengguna, kita perlu memberi perhatian kepada risiko bahawa teg HTML mungkin disalahgunakan, seperti kemungkinan serangan XSS (serangan skrip merentas tapak) dan isu keselamatan lain. Oleh itu, sesetengah aplikasi mengesahkan sama ada input mengandungi teg berniat jahat atau haram untuk memastikan keselamatan dan kebolehpercayaan halaman. Di bawah ini kami akan memperkenalkan cara untuk mengesahkan sama ada input ialah teg HTML yang sah dalam bahasa Go.

Kaedah pertama ialah menggunakan pustaka asli Go Kita boleh menggunakan fungsi html.Parse untuk menghuraikan kod HTML ke dalam pepohon nod, dan kemudian semak jenis dan atribut nod. Berikut ialah contoh kod:

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
}

Dalam kod di atas, kami mula-mula menggunakan fungsi html.Parse untuk menghuraikan kod HTML input ke dalam pepohon nod. Kemudian lelaran melalui setiap nod, dan jika jenis nod ialah ElementNode, anda perlu menyemak nama dan atribut label nod. Dalam contoh ini, kami hanya membenarkan teg 3499910bf9dac5ae3c52d5ede7383485, 907fae80ddef53131f3292ee4f81644b, 8e99a69fbe029cd4e2b854e244eab143 dan a1f02c36ba31691bcfe87b2722de723b dan mengembalikan palsu jika teg lain ditemui. Untuk teg yang dibenarkan, kita juga perlu menyemak sama ada teg tersebut mengandungi atribut yang diperlukan, contohnya, teg 3499910bf9dac5ae3c52d5ede7383485 perlu mengandungi atribut href dan title dan teg a1f02c36ba31691bcfe87b2722de723b perlu mengandungi src, alt dan titleHartanah. Apabila menyemak atribut, kita boleh menggunakan fungsi containsAttributes, yang menerima nod dan senarai atribut dan menyemak sama ada nod mengandungi semua atribut yang ditentukan.

Kaedah kedua ialah menggunakan perpustakaan pihak ketiga dalam bahasa Go boleh membantu kami mengesahkan teg HTML dalam input dengan lebih mudah, seperti github.com/microcosm-cc/bluemonday. dan github.com/theplant/htmlsanitizer. Perpustakaan ini menyediakan beberapa API mudah yang membolehkan kami mentakrifkan senarai putih atau senarai hitam dengan mudah dan menapis keluar teg yang tidak memenuhi keperluan. Sebagai contoh, berikut ialah contoh kod menggunakan pustaka 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>
}

Dalam kod di atas, kami mula-mula mentakrifkan dasar keselamatan lalai (bluemonday.StrictPolicy()), dan kemudian menggunakan fungsi polisi.Sanitize untuk tapis kod HTML input. Menurut dasar keselamatan lalai, kami membenarkan teg 907fae80ddef53131f3292ee4f81644b tetapi tidak membenarkan teg lain. Memandangkan bluemonday menyokong tahap penyesuaian yang lebih tinggi, kami boleh menentukan dasar keselamatan kami sendiri berdasarkannya. Sila rujuk dokumentasinya untuk penggunaan khusus.

Sahkan bahawa input pengguna ialah teg HTML yang sah, ini adalah keperluan biasa dan penting. Di atas secara ringkas memperkenalkan cara menggunakan perpustakaan asli Go dan perpustakaan pihak ketiga untuk mencapai keperluan ini, saya harap ia akan membantu anda.

Atas ialah kandungan terperinci Bagaimana untuk mengesahkan sama ada input adalah teg Html yang sah dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn