Jinja: По умолчанию автоматическое экранирование отключено, по умолчанию опасно.

Созданный на 6 янв. 2016  ·  4Комментарии  ·  Источник: pallets/jinja

Сегодня я обнаружил через XSS, о котором сообщили извне, что Jinja не включает автоэскейп по умолчанию. Это опасное значение по умолчанию, которое становится еще более опасным из-за того, что многие люди знакомятся с Jinja благодаря своим предыдущим знаниям шаблонов Django, в которых по умолчанию включено автоматическое экранирование с 2007 года.

Просматривая Интернет, похоже, что этот факт малоизвестен. Фактически, я даже нашел книги (объектно-ориентированное программирование Python 3, глава 12, cc @buchuki), в которых рекомендуется использовать jinja2 для веб-сайтов и не использовать автоматическое экранирование. Случайная выборка проектов Github также показывает, что большинство людей не добавляют в свой проект autoescape = True или расширение autoescape.

Хотя я понимаю, что на этом этапе, вероятно, будет сложно перейти на более безопасное значение по умолчанию, но в документации должно быть хотя бы очевидно, что автоматическое экранирование по умолчанию отключено. Возможно, добавьте autoescape = True ко всем примерам, которые создают объект jinja2.Environment и / или добавьте раздел в документации на самом раннем этапе.

Самый полезный комментарий

Похоже, хороший кандидат на пулреквест :)

Все 4 Комментарий

Jinja - это не только для HTML, но и для универсального шаблонизатора. Я думаю, что большинство людей используют Jinja во Flask, который по умолчанию включает автоэскейп для HTML-шаблонов. Если вы интегрируете механизм шаблонов в свой собственный фреймворк, вы должны прочитать документацию о том, как его безопасно использовать.

Тем не менее, я думаю, что я очень четко указал в документации, что вам, вероятно, следует использовать autoescape при генерации HTML, - это хорошее предложение.

Я предполагаю, что большинство основных фреймворков понимают это правильно (больше глаз, меньше ошибок и т. Д.), Но есть также много небольших проектов, интегрирующих Jinja вручную, которые действительно допускают эту ошибку.

И, честно говоря, документация Jinja по этому поводу очень скудна. Вот что вы впервые видите, открывая документацию Jinja:

Jinja2 - это современный и удобный для разработчиков язык шаблонов для Python, созданный по образцу шаблонов Django. Это быстро, широко и безопасно с дополнительной изолированной средой выполнения шаблона:

«смоделирован по шаблонам Django» и «безопасный» может наводить на мысль, что он имеет функции безопасности шаблонов Django, такие как автоматическое экранирование.

Затем пример - HTML. И сразу после этого в списке возможностей:

мощная автоматическая система экранирования HTML для предотвращения XSS

Что не упоминает, что это необязательно и не включено по умолчанию.

На странице документации «Базовое использование API» не отображается включенное автоматическое экранирование, но и не отображается HTML, так что я думаю, что это нормально. Но затем, когда вы перейдете на страницу «Основы» API :

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
template = env.get_template('mytemplate.html')
print template.render(the='variables', go='here')

Первый пример уязвим для тривиальных XSS-атак. Люди правы, если их сбивают с толку.

Похоже, хороший кандидат на пулреквест :)

Мы не можем выключить это сейчас, не нарушив общий код. Однако я рад соответствующим образом обновить документы. Я закрою это как wontfix, но не стесняйтесь открывать PR для обновлений документации.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги