8

バックエンドでGolangを使用しています。html/templates を使用して html をレンダリングすると、ZgotmplZURL が取得されます。

{{if .UserData.GitURL}}
<li>
  <a href="{{.UserData.GitURL}}">
    <i class="icon fa fa-github"></i>
  </a>
</li>
{{end}}

サーバー側で GitURL に文字列を使用しています。この URL はhttps. 私が解決策を探したとき、いくつかのブログが使用を提案しましたsafeURL。だから私は試しました、

{{if .UserData.GitURL}}
<li>
  <a href="{{.UserData.GitURL | safeURL}}">
    <i class="icon fa fa-github"></i>
  </a>
</li>
{{end}}

しかし、コードはコンパイルされませんでした。

誰かがこれで私を助けてくれますか? どんな提案も本当に役に立ちます。

4

1 に答える 1

8

ZgotmplZ入力が無効であることを示す特別な値です。のドキュメントから引用html/template

"ZgotmplZ" is a special value that indicates that unsafe content reached a
CSS or URL context at runtime. The output of the example will be
   <img src="#ZgotmplZ">
If the data comes from a trusted source, use content types to exempt it
from filtering: URL(`javascript:...`).

有効なURL テキストに置き換えたい場合は、特別なsafeURL機能などは必要ありません。テンプレートの実行結果が のような値になった場合"#ZgotmplZ"、挿入しようとしていた URL が無効であることを意味します。

次の例を参照してください。

t := template.Must(template.New("").Parse(`<a href="{{.}}"></a>` + "\n"))
t.Execute(os.Stdout, "http://google.com")
t.Execute(os.Stdout, "badhttp://google.com")

出力:

<a href="http://google.com"></a>
<a href="#ZgotmplZ"></a>

template.URLURL をエスケープせずにそのまま使用する場合は、type の値を使用できます。この場合、有効な URL でなくても、指定された値がそのまま使用されることに注意してください。

safeURLテンプレートで使用できるある種のマジックまたは事前宣言された関数ではありません。stringただし、 url パラメーターを type の値として返す独自のカスタム関数を登録することもできますtemplate.URL

t2 := template.Must(template.New("").Funcs(template.FuncMap{
    "safeURL": func(u string) template.URL { return template.URL(u) },
}).Parse(`<a href="{{. | safeURL}}"></a>` + "\n"))
t2.Execute(os.Stdout, "http://google.com")
t2.Execute(os.Stdout, "badhttp://google.com")

出力:

<a href="http://google.com"></a>
<a href="badhttp://google.com"></a>

注:テンプレートの実行に値を直接渡すことができる場合は、カスタム関数template.URLを登録して使用する必要はありません。safeURL()

t3 := template.Must(template.New("").Parse(`<a href="{{.}}"></a>` + "\n"))
t3.Execute(os.Stdout, template.URL("http://google.com"))
t3.Execute(os.Stdout, template.URL("badhttp://google.com"))

出力:

<a href="http://google.com"></a>
<a href="badhttp://google.com"></a>

Go Playgroundでこれらを試してみてください。

于 2016-04-04T07:14:06.660 に答える