ホームページ  >  記事  >  バックエンド開発  >  入力が golang で有効な HTML タグであるかどうかを確認する方法

入力が golang で有効な HTML タグであるかどうかを確認する方法

王林
王林オリジナル
2023-06-24 08:11:171230ブラウズ

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 の場合は、ノードのラベル名とプロパティを確認する必要があります。この例では、3499910bf9dac5ae3c52d5ede7383485907fae80ddef53131f3292ee4f81644b8e99a69fbe029cd4e2b854e244eab143、および a1f02c36ba31691bcfe87b2722de723b## のみを許可します# タグ。他のタグが見つかった場合は false を返します。許可されたタグについては、必要な属性が含まれているかどうかも確認する必要があります。たとえば、3499910bf9dac5ae3c52d5ede7383485 タグには、hreftitle が含まれている必要があります。 ##a1f02c36ba31691bcfe87b2722de723b タグには、srcalt、および 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 コードをフィルターします。デフォルトのセキュリティ ポリシーに従って、

907fae80ddef53131f3292ee4f81644b

タグは許可されますが、他のタグは許可されません。 bluemonday は高度なカスタマイズをサポートしているため、それに基づいて独自のセキュリティ ポリシーを定義できます。具体的な使用方法については、ドキュメントを参照してください。 ユーザー入力が有効な HTML タグであることを確認します。これは一般的かつ重要な要件です。上記では、この要件を実現するために Go ネイティブ ライブラリとサードパーティ ライブラリを使用する方法を簡単に紹介しました。

以上が入力が golang で有効な HTML タグであるかどうかを確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。