質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

3041閲覧

Ginのテンプレートで変数内の改行を有効にしたいです

tnishi

総合スコア16

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2020/09/25 09:00

Golang初心者です。
フレームワークはGinを採用してコーディングを行っています。

テキストエリアに入力した改行を含む文言を、遷移先の確認画面に表示させる際、
文言が格納されている変数内の「\n」を「<br />」に変換し出力しましたが「<br />」がそのまま表示されてしまいます。
だいぶ省略して申し訳ございませんが以下ソースとなります。

【main.go】

Go

1package main 2 3import "regexp" 4 5func main() { 6 7 app := gin.Default() 8 app.GET("/profile", func(c *gin.Context) { 9 c.HTML(200, "profile.html", gin.H{}) 10 }) 11 12 app.POST("/profile", func(c *gin.Context) { 13 letter := c.PostForm("letter") 14 rep := regexp.MustCompile(`\r\n|\r|\n`) 15 letter = rep.ReplaceAllString(letter, "<br />") 16 c.HTML(200, "confirm.html", gin.H{"letter":letter}) 17 }) 18 app.Run() 19} 20

【confirm.html】

html

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8" /> 5 <title>テスト</title> 6 </head> 7 <body> 8 <div> 9 <label>{{.letter}}<label> 10 </div> 11 </body> 12</html>

goファイル側で改行コードを「<br />」に変換していますが、
confirm.htmlの{{.letter}}では「<br />」がそのまま表示されてしまいます。

何か他に特殊な処理が必要なのでしょうか。
調べてもわからず、といった状況です。

どなたかおわかりの方いらっしゃればお力いただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ginの c.HTML は基本的に html/templete を用いて文字列をマッピングしています。

そして html/templete は "<" といったHTMLの特殊文字をエスケープします。そうでなければJavaScript インジェクションといった攻撃に対して脆弱になります。

https://golang.org/pkg/html/template/


はっきりと確証はないですが main.go を以下のように修正したら、問題は解決しますか?

go

1package main 2 3import ( 4 "html/template" 5 "regexp" 6 7 "github.com/gin-gonic/gin" 8) 9 10func main() { 11 12 app := gin.Default() 13 app.LoadHTMLGlob("./*.html") 14 15 app.GET("/profile", func(c *gin.Context) { 16 c.HTML(200, "profile.html", gin.H{}) 17 }) 18 19 app.POST("/profile", func(c *gin.Context) { 20 letter := c.PostForm("letter") 21 rep := regexp.MustCompile(`\r\n|\r|\n`) 22 letter = rep.ReplaceAllString(letter, "<br />") 23 t := template.HTML(letter) 24 c.HTML(200, "confirm.html", gin.H{"letter": t}) 25 }) 26 app.Run() 27}

bash

1curl -X POST localhost:8080/profile -i -F 'letter=hoge\nhoge'

投稿2020/09/26 08:02

d_tutuz

総合スコア730

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tnishi

2020/09/28 10:06

d_tutuz様 コメントありがとうございます。 また、反応遅くなり申し訳ございません。 ご教示いただいた通りにやってみたところ、確認画面で改行されるようになりました! 「html/templete」についてのドキュメント、及び脆弱性の説明も丁寧にしていただきありがとうございます。 今後もGoについて質問をさせていただくことがあるかと思いますのでその際はどうぞよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問