10

改行を含むテキスト ファイルを読み込んで、html/templates.

\n読み込まれた文字列にwithを代入すると、改行が発生する代わりに、<br>テンプレートによって html にエスケープされ、ブラウザーに表示されます。&lt;br&gt;

text/templates(XSS 保護がない)に切り替えることなく、この動作を変更するにはどうすればよいですか?

4

5 に答える 5

12

最初にテキストに対して template.HTMLEscape() を実行してサニタイズし、信頼できる置換に \n を実行してから
、それを事前にエスケープされた信頼できるテンプレート データとして使用できるようです。

更新:Kockaの例を拡張すると、これは私が念頭に置いていたことです:

package main

import (
    "html/template"
    "os"
    "strings"
)

const page = `<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <p>{{.}}</p>
  </body>
</html>`

const text = `first line
<script>dangerous</script>
last line`

func main() {
    t := template.Must(template.New("page").Parse(page))
    safe := template.HTMLEscapeString(text)
    safe = strings.Replace(safe, "\n", "<br>", -1)
    t.Execute(os.Stdout, template.HTML(safe)) // template.HTML encapsulates a known safe HTML document fragment.
}

http://play.golang.org/p/JiH0uD5Zh2

出力は

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <p>first line<br>&lt;script&gt;dangerous&lt;/script&gt;<br>last line</p>
  </body>
</html>

そして、ブラウザでレンダリングされるテキストは

first line
<script>dangerous</script>
last line
于 2012-12-08T21:59:35.850 に答える
4

\nどこに置き換えているのかわかりませんが、それが進行中の場合は、エスケープされないように<br>文字列をキャストできます。template.HTML

参照: http://golang.org/pkg/html/template/#HTML

テンプレートにある場合は、利用可能なパイプラインがあるはずです。{{. | html}}

于 2012-12-08T16:29:06.483 に答える
2

あなたはこのようにそれを行うことができます:

package main

import (
    "html/template"
    "os"
)

const page = `<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <p>{{.}}</p>
  </body>
</html>`

func main() {
    t := template.Must(template.New("page").Parse(page))
    t.Execute(os.Stdout, template.HTML("<br>"))
}

やってみよう!

于 2012-12-09T09:51:25.983 に答える
1

テンプレート全体を安全でないテンプレートとして渡す必要はありません (これは悪い習慣です)。

テンプレートにマップを渡す必要があり、使用したい要素のみを明示的に「安全でない」ものにします。

package main

import "bytes"
import "fmt"
import "html/template"
import "strings"

var input = `
  {{ define "LAYOUT" }}
    <html>
      <body>
        {{ template "CONTENT" . }}
      </body>
    </html>
  {{ end }}

  {{ define "CONTENT" }}
    Unsafe content: {{ .Unsafe }}
    Newlines converted to <br/> follow:
    {{ .Normal }}
  {{ end }}

  {{ template "LAYOUT" . }}
`

var other = `
  Hello
  World
  Again
`

var other2 = `
  <script>alert("Owned!");</script>
`

func main() {

    var t, err = template.New("sample").Parse(input)
    if err != nil {
        panic(err)
    }

    var fixed = strings.Replace(other, "\n", "\n<br/>", -1)
    var model = map[string]interface{}{
        "Normal": template.HTML(fixed),
        "Unsafe": other2,
    }

    var out bytes.Buffer
    t.Execute(&out, model) # <--- !! Notice the model is NOT an HTML type.

    var raw = out.String()
    fmt.Printf("%s", raw)
}

収量:

Unsafe content:    &lt;script&gt;alert(&#34;Owned!&#34;);&lt;/script&gt;

Newlines converted to <br/> follow:
 <br/>  Hello 
 <br/>  World 
 <br/>  Again 
 <br/>

  </body>
</html>
于 2013-02-28T05:53:25.940 に答える