safe.JS
语法
safe.JS INPUT
返回值
template.JS
别名
safeJS
简介
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>