Пакет 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, <script>alert('you have been pwned')</script>!
Контексты
Этот пакет понимает HTML, CSS, JavaScript и URI. Он добавляет функции очистки к каждому простому конвейеру действий, поэтому, учитывая отрывок
<a href="/search?q={{.}}">{{.}}</a>
Во время синтаксического анализа каждый {{.}} перезаписывается для добавления функций экранирования по мере необходимости. В этом случае он становится
<a href="/search?q={{. | urlescaper | attrescaper}}">{{. | htmlescaper}}</a>
где urlescaper, attrescaper и htmlescaper - псевдонимы для внутренних функций экранирования.
Для этих внутренних функций экранирования, если конвейер действий оценивает значение интерфейса nil, он обрабатывается как пустая строка.
Читайте также:
Комментариев нет:
Отправить комментарий