golang-標準ライブラリ(html/template)
3986 ワード
この標準ライブラリは,goがデータ駆動を実現したテンプレートであり,コード注入に対抗できる安全なHTML出力を生成するために用いられる.簡単に言えばhtml、css、javascriptを安全に変換することです.たとえばhtmlのこのラベルの特殊文字<>を変換します.安全なhtmlテンプレートコードを生成する方法もあります.
これに似て、もう一つのパッケージtext/templateは、前者がhtmlを解析し、後者が通常のテキスト文字列を解析するだけです.
まず、簡単なhtmlクリップの変換方法をいくつか見てみましょう.
まずよくあるhtmlエスケープ文字をいくつか認識してみましょう
"
"
"
&
&
&
<
<
<
>
>
>
スペースをどんどん開く(non-breaking space)
コードの例を次に示します.
javascriptコードのエスケープ方法をいくつか見てみましょう
javascriptコードのエスケープ例を次に示します.
urlのエスケープ方法を見てみましょう.
次にtempldateパッケージが提供する安全な(注入防止)htmlテンプレートコードを生成する方法を見る
まず簡単な方法をいくつか見てみましょう.
簡単なコードの例を次に示します.
上記の例では、カスタムhtmlテンプレートの使い方を大まかに認識しましたが、htmlテンプレートの他の方法を見てみましょう.
ここで,templdateパッケージの基本的な使い方を紹介したとしても,templateパッケージは日常開発においてhtmlクリップテンプレートを生成するために用いられる.あまり使わない.
これに似て、もう一つのパッケージtext/templateは、前者がhtmlを解析し、後者が通常のテキスト文字列を解析するだけです.
まず、簡単なhtmlクリップの変換方法をいくつか見てみましょう.
func HTMLEscapeString(s string) string =》 s HTML 。
func HTMLEscaper(args ...interface{}) string =》 HTML
func HTMLEscape(w io.Writer, b []byte) =》 w b HTML
まずよくあるhtmlエスケープ文字をいくつか認識してみましょう
"
"
"
&
&
&
<
<
<
>
>
>
スペースをどんどん開く(non-breaking space)
コードの例を次に示します.
package main
import (
"fmt"
"html/template"
)
func main() {
s := template.HTMLEscapeString("hello")
fmt.Println(s) // <div>hello</div>
s = template.HTMLEscaper("","hello","")
fmt.Println(s) // <div>hello</div>
// template.HTMLEscape() // html w ,
}
javascriptコードのエスケープ方法をいくつか見てみましょう
func JSEscapeString(s string) string =》 s JavaScript 。
func JSEscaper(args ...interface{}) string =》 JavaScript 。
func JSEscape(w io.Writer, b []byte) =》 w b JavaScript 。
javascriptコードのエスケープ例を次に示します.
func main() {
s := template.JSEscapeString("var a = 'hello'")
fmt.Println(s) // var a = \'hello\'
s = template.JSEscaper("var"," a = ","'hello'")
fmt.Println(s) // var a = \'hello\'
// template.JSEscape() // javascript w ,
}
urlのエスケープ方法を見てみましょう.
func URLQueryEscaper(args ...interface{}) string =》 URL
package main
import (
"fmt"
"html"
"html/template"
)
func main() {
s := template.URLQueryEscaper("name=go&age=10")
fmt.Println(s) // name%3Dgo%26age%3D10
// URLQueryEscaper ASCII ;= ASCII 3D, html EscapeString , :
fmt.Println(html.EscapeString("name=go&age=10")) // name=go&age=10
// html.EscapeString html ;= &
}
次にtempldateパッケージが提供する安全な(注入防止)htmlテンプレートコードを生成する方法を見る
まず簡単な方法をいくつか見てみましょう.
func New(name string) *Template =》 name
func (t *Template) Parse(src string) (*Template, error) =》 src
func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error =》 name , data , wr
func (t *Template) Execute(wr io.Writer, data interface{}) error => , 。
簡単なコードの例を次に示します.
package main
import (
"html/template"
"os"
)
func main() {
// , ;{{define "T"}} T , , ,
// {{.}} ,{{end}} , ;
temp,_ := template.New("foo").Parse(`{{define "T"}} hello {{.}}{{end}}`)
// , 。
temp.ExecuteTemplate(os.Stdout,"T","go") // hello <div>go</div>
// , {{.}} html , html
//
temp,_ := template.New("foo").Parse(`hello {{.}}`)
// , 。
temp.Execute(os.Stdout,"go") // hello <div>go</div>
// , {{.}} html , html
}
上記の例では、カスタムhtmlテンプレートの使い方を大まかに認識しましたが、htmlテンプレートの他の方法を見てみましょう.
func (t *Template) ParseFiles(filenames ...string) (*Template, error) =》 filenames 。 , nil, (t, nil)。 。Parse ,ParseFiles , 。
ここで,templdateパッケージの基本的な使い方を紹介したとしても,templateパッケージは日常開発においてhtmlクリップテンプレートを生成するために用いられる.あまり使わない.