Go 言語は、高速かつ効率的で強力に型指定されたプログラミング言語であり、ネットワーク サービス開発、クラウド コンピューティング、データ サイエンス、インターネット金融などの分野で広く使用されています。入力検証は Web アプリケーション開発において非常に重要な問題であり、入力内の HTML タグが有効かどうかを検証するのは一般的な要件です。以下では、この要件を Go 言語で実装する方法を紹介します。
HTML タグは Web ページで重要な役割を果たし、ページの構造、スタイル、インタラクティブな動作を定義します。ただし、ユーザー入力を処理するときは、潜在的な 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>
、<em>
、<strong>
、および <img>## のみを許可します# タグ。他のタグが見つかった場合は false を返します。許可されたタグについては、必要な属性が含まれているかどうかも確認する必要があります。たとえば、
<a> タグには、
href と
title が含まれている必要があります。 ##<img>
タグには、src
、alt
、および title
属性が含まれている必要があります。属性をチェックする場合、containsAttributes 関数を使用できます。この関数は、ノードと属性のリストを受け取り、指定されたすべての属性がノードに含まれているかどうかをチェックします。 2 番目の方法は、サードパーティ ライブラリを使用することです。Go 言語の一部のサードパーティ ライブラリは、github.com/microcosm-cc/ など、入力内の HTML タグをより簡単に検証するのに役立ちます。 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 コードをフィルターします。デフォルトのセキュリティ ポリシーに従って、
<em> タグは許可されますが、他のタグは許可されません。 bluemonday は高度なカスタマイズをサポートしているため、それに基づいて独自のセキュリティ ポリシーを定義できます。具体的な使用方法については、ドキュメントを参照してください。 ユーザー入力が有効な HTML タグであることを確認します。これは一般的かつ重要な要件です。上記では、この要件を実現するために Go ネイティブ ライブラリとサードパーティ ライブラリを使用する方法を簡単に紹介しました。
以上が入力が golang で有効な HTML タグであるかどうかを確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。