safe.HTMLAttr
介紹
Hugo 使用 Go 的 text/template 和 html/template 套件。
text/template
套件實現了資料驅動的範本,用於生成文字輸出;而 html/template
套件則實現了資料驅動的範本,用於生成安全防範程式碼注入的 HTML 輸出。
預設情況下,Hugo 在渲染 HTML 檔案時會使用 html/template
套件。
為了生成避免程式碼注入的安全 HTML 輸出,html/template
套件會在特定情境下對字串進行轉譯。
使用方式
使用 safe.HTMLAttr
函式來封裝來自可信來源的 HTML 屬性。
使用此類型會存在安全風險:封裝的內容應來自可信來源,因為它將在範本輸出中原文包含。
詳情請參閱 Go 文件。
範例
未宣告為安全的情況下:
{{ with .Date }}
{{ $humanDate := time.Format "2 Jan 2006" . }}
{{ $machineDate := time.Format "2006-01-02T15:04:05-07:00" . }}
<time datetime="{{ $machineDate }}">{{ $humanDate }}</time>
{{ end }}
Hugo 渲染後為:
<time datetime="2024-05-26T07:19:55+02:00">26 May 2024</time>
要將鍵值對宣告為安全:
{{ with .Date }}
{{ $humanDate := time.Format "2 Jan 2006" . }}
{{ $machineDate := time.Format "2006-01-02T15:04:05-07:00" . }}
<time {{ printf "datetime=%q" $machineDate | safeHTMLAttr }}>{{ $humanDate }}</time>
{{ end }}
Hugo 渲染後為:
<time datetime="2024-05-26T07:19:55+02:00">26 May 2024</time>