Go 언어는 빠르고 효율적이며 강력한 형식의 프로그래밍 언어로 네트워크 서비스 개발, 클라우드 컴퓨팅, 데이터 과학, 인터넷 금융 및 기타 분야에서 널리 사용됩니다. 입력 유효성 검사는 웹 애플리케이션 개발에서 매우 중요한 문제이며, 입력의 HTML 태그가 유효한지 확인하는 것은 일반적인 요구 사항입니다. 아래에서는 Go 언어에서 이 요구 사항을 구현하는 방법을 소개합니다.
HTML 태그는 웹페이지에서 중요한 역할을 하며 페이지의 구조, 스타일 및 대화형 동작을 정의합니다. 그러나 사용자 입력을 처리할 때 잠재적인 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></a>
, <em></em>
, <strong></strong>
및 <img alt="입력이 golang의 유효한 HTML 태그인지 확인하는 방법" >만 허용됩니다. ;
태그, 다른 태그가 발견되면 false를 반환합니다. 허용된 태그의 경우 필요한 속성이 포함되어 있는지도 확인해야 합니다. 예를 들어 3499910bf9dac5ae3c52d5ede7383485
태그에는 href
및 title 속성, <code><img alt="입력이 golang의 유효한 HTML 태그인지 확인하는 방법" >
태그에는 src
, alt
및 title
이 포함되어야 합니다. 속성. 속성을 확인할 때 노드와 속성 목록을 받아들이고 노드에 지정된 모든 속성이 포함되어 있는지 확인하는 containAttributes 함수를 사용할 수 있습니다. 3499910bf9dac5ae3c52d5ede7383485
、907fae80ddef53131f3292ee4f81644b
、8e99a69fbe029cd4e2b854e244eab143
和a1f02c36ba31691bcfe87b2722de723b
标签,如果发现其他标签则返回false。 对于被允许的标签,我们还需要检查它们是否包含必要的属性,例如3499910bf9dac5ae3c52d5ede7383485
标签需要包含href
和title
属性,而a1f02c36ba31691bcfe87b2722de723b
标签需要包含src
、alt
和title
属性。在检查属性时,我们可以使用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
rrreee
위 코드에서는 먼저 기본 보안 정책(bluemonday.StrictPolicy())을 정의한 다음,policy.Sanitize 함수를 사용하여 입력 HTML을 필터링합니다. 암호. 기본 보안 정책에 따라907fae80ddef53131f3292ee4f81644b
태그는 허용되지만 다른 태그는 허용되지 않습니다. bluemonday는 더 높은 수준의 사용자 정의를 지원하므로 이를 기반으로 자체 보안 정책을 정의할 수 있습니다. 구체적인 사용법은 해당 문서를 참조하세요. 🎜🎜사용자 입력이 유효한 HTML 태그인지 확인하세요. 이는 일반적이고 중요한 요구 사항입니다. 위 내용은 Go 네이티브 라이브러리와 타사 라이브러리를 사용하여 이 요구 사항을 충족하는 방법을 간략하게 소개한 내용입니다. 🎜위 내용은 입력이 golang의 유효한 HTML 태그인지 확인하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!