Когда я должен использовать escape и safe в системе шаблонов Django?
Если у меня есть поле, в которое люди помещают комментарии, а затем я отображаю этот комментарий следующим образом... я должен уйти?
{{ c.title }}
4 ответа
На самом деле, это зависит. Шаблонный движок Django автоматически убегает, так что вам не нужно убегать.
Если вы добавите шаблон фильтра "безопасный", как {{c.title|safe}}
тогда вам нужно беспокоиться о таких вещах, как внедрение html, потому что "safe" помечает строку как таковую и означает, что она не будет экранирована.
Существует также тег шаблона {% autoescape on %}...{% endautoescape %}, где "on" может быть изменено на "off", если необходимо. По умолчанию он включен и тег не нужен.
Другие движки шаблонов могут по умолчанию не экранироваться, Jinja2 является одним из них.
Автоматическое экранирование HTML включено по умолчанию, поэтому вам не нужно вручную экранировать в большинстве случаев, но не во всех!
Дамп содержимого переменной внутри HTML-элемента - это хорошо:
<p>{{ variable }}</p>
Джанго автоматически сбежит от персонажей <
, >
, &
, "
а также '
что и здесь нужно.
Также можно сбросить переменную внутри атрибута, так как "
а также '
оба экранированы, но не забудьте включить кавычки, так как пробелы не экранируются:
<span class="{{ variable }}">...</span> <!-- Good -->
<span class={{ variable }}>...</span> <!-- Bad -->
Если вы хотите использовать строку внутри встроенного Javascript, вы должны использовать escapejs
фильтр, и не забывайте цитаты. Это защищает как от выхода из кавычек для переменной Javascript, так и от выхода из кавычек <script>
использование тегов </script>
:
<script>
var value = "{{ variable|escapejs }}";
</script>
Да! Что если они вошли <script>alert('boom');</script>
как заголовок?
Django autoescape делает это намного проще.
Автоматическое экранирование включено по умолчанию в шаблонах django, поэтому вам не нужно использовать escape. Безопасный используется, когда вы хотите отключить его и сообщить системе визуализации шаблонов, что ваша дата безопасна в неоткрытом виде. Смотрите Django Docs для деталей: