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 <a>
, <em>
, <strong>
dan <img>
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 <a>
perlu mengandungi atribut href
dan title
dan teg <img>
perlu mengandungi src
, alt
dan title
Hartanah. 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 <em>
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!