逃逸';至' 在golang html模板中

逃逸';至&#39; 在golang html模板中,go,Go,如何防止越狱到': package main import ( "html/template" "os" ) const tmpl = `<html> <head> <title>{{.Title}}</title> </head> </html>` func main() { t := template.Must(template.New("ex").Pa

如何防止越狱到
':

package main

import (
    "html/template"
    "os"
)

const tmpl = `<html>
    <head>
        <title>{{.Title}}</title>
    </head>
</html>`

func main() {
    t := template.Must(template.New("ex").Parse(tmpl))
    v := map[string]interface{}{
        "Title": template.HTML("Hello World'"),
    }
    t.Execute(os.Stdout, v)
}
主程序包
进口(
“html/模板”
“操作系统”
)
常数tmpl=`
{{.Title}
`
func main(){
t:=template.Must(template.New(“ex”).Parse(tmpl))
v:=map[string]接口{}{
“Title”:template.HTML(“Hello World”),
}
t、 执行(os.Stdout,v)
}
它输出:

<html>
    <head>
        <title>Hello World&#39;</title>
    </head>
</html>

世界你好';
期望输出:

<html>
    <head>
        <title>Hello World'</title>
    </head>
</html>

你好,世界杯

@dyoo已经清楚地解释了
内容被视为RCDATA。进行转义的代码是。如果t==contentTypeHTML
的分支是
template.HTML
的分支


如果您确实需要控制源代码的输出,请使用
text/template
并手动进行转义。

请向我提供您正在使用的js库。';没关系,就别管它了。@Innovation没有js,只有Golang从
html/template
的输出首先是针对web浏览器的,而不是人类。该库正在按设计工作:它的行为可能不是您想要的,但它正在做它所说的:生成安全的HTML,防止代码注入。特别要注意的是,这是上下文敏感的:如果您在常规段落中进行注入,它不会执行相同的转义(),因此必须对
TITLE
有上下文敏感的内容,库知道您没有考虑这些内容。具体来说,它使用的是RCDATA转义约定。为了增加@dyoo的注释,该行为是规范所要求的:(在此之后查找
title
)。HTML语法是多么的复杂,这让我感到惊讶。。。