четверг, 6 августа 2020 г.

Пакет template (html/template) в Golang

Пакет template (html/template) реализует управляемые данными шаблоны для генерации вывода HTML, защищенного от внедрения кода. Он предоставляет тот же интерфейс, что и пакет text/template, и его следует использовать вместо text/template всякий раз, когда выводится HTML.

Этот пакет обертывает пакет text/template, поэтому вы можете использовать его template API интерфейс для безопасного анализа и выполнения HTML-шаблонов.

tmpl, err := template.New("name").Parse(...)
// Проверка ошибок отменена
err = tmpl.Execute(out, data)

В случае успеха tmpl теперь будет безопасным от инъекций. В противном случае err - это ошибка, определенная как ErrorCode.

Шаблоны HTML обрабатывают значения данных как простой текст, который следует закодировать, чтобы их можно было безопасно встроить в документ HTML. Экранирование контекстно, поэтому действия могут появляться в контекстах JavaScript, CSS и URI.

Модель безопасности, используемая этим пакетом, предполагает, что авторам шаблонов доверяют, в то время как параметрам данных Execute - нет.

Пример

import "text/template"
...
t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")

производит

Hello, <script>alert('you have been pwned')</script>!

но контекстное автоэкранирование в html/template

import "html/template"
...
t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")

производит безопасный, экранированный вывод HTML

Hello, &lt;script&gt;alert(&#39;you have been pwned&#39;)&lt;/script&gt;!

Контексты

Этот пакет понимает HTML, CSS, JavaScript и URI. Он добавляет функции очистки к каждому простому конвейеру действий, поэтому, учитывая отрывок

<a href="/search?q={{.}}">{{.}}</a>

Во время синтаксического анализа каждый {{.}} перезаписывается для добавления функций экранирования по мере необходимости. В этом случае он становится

<a href="/search?q={{. | urlescaper | attrescaper}}">{{. | htmlescaper}}</a>

где urlescaper, attrescaper и htmlescaper - псевдонимы для внутренних функций экранирования.

Для этих внутренних функций экранирования, если конвейер действий оценивает значение интерфейса nil, он обрабатывается как пустая строка.


Читайте также:


Комментариев нет:

Отправить комментарий