safe.JS
介紹
Hugo 使用 Go 的 text/template 和 html/template 套件。
text/template
套件實現了資料驅動的範本,用於生成文字輸出;而 html/template
套件則實現了資料驅動的範本,用於生成安全防範程式碼注入的 HTML 輸出。
預設情況下,Hugo 在渲染 HTML 檔案時會使用 html/template
套件。
為了生成避免程式碼注入的安全 HTML 輸出,html/template
套件會在特定情境下對字串進行轉譯。
使用方式
使用 safe.JS
函式來封裝已知安全的 EcmaScript5 表達式。
模板作者需確保輸入的表達式不會破壞預期的優先權,並且避免表達式與陳述之間的模糊性,如 { foo: bar() }\n['foo']()
,這可能是有效的表達式,但具有完全不同的意義。
使用此類型會存在安全風險:封裝的內容應來自可信來源,因為它將在範本輸出中原文包含。
使用 safe.JS
函式來包含有效但未經信任的 JSON 是不安全的。可以使用 transform.Unmarshal
函式來解析 JSON,然後將結果對象傳入範本,範本會將其轉換為在 JavaScript 上顯示的已消毒 JSON。
詳情請參閱 Go 文件。
範例
未宣告為安全的情況下:
{{ $js := "x + y" }}
<script>const a = {{ $js }}</script>
Hugo 渲染後為:
<script>const a = "x + y"</script>
要將字串宣告為安全:
{{ $js := "x + y" }}
<script>const a = {{ $js | safeJS }}</script>
Hugo 渲染後為:
<script>const a = x + y</script>