Когда я должен использовать 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 для деталей:

Другие вопросы по тегам