Шаблоны и разметка - PullRequest
       23

Шаблоны и разметка

2 голосов
/ 19 июня 2011

Я использую Google App Engine и столкнулся со следующей проблемой. Мне нужно хранить в тексте Datastorage, как "

Мой текст

". Когда я использовал шаблоны Django 0,96, все было в порядке. Текст был показан с ожидаемой разметкой. Но я изменил шаблоны на шаблоны Django 1.2, и моя разметка была изменена на объекты HTML. Как решить эту проблему?

P.S. Я не пользуюсь помощником Django или любыми другими сторонними библиотеками.


Если режим фильтра является режимом по умолчанию для шаблонов, поэтому использование «safe» или «autoescape on» выглядит как взлом. Я пытаюсь понять, как авторы Django представляли себя с помощью шаблонов. Я не думаю, что журналисты помимо публикации материалов также создают шаблоны для каждой своей статьи. То есть должен быть каким-то средством, позволяющим форматировать текст, например tinyMCE или Markdown. Но когда разметка хранится в БД, шаблоны показывают ее в виде HTML-сущностей.

Конечно, можно использовать фильтры «безопасный» или «автоэкранирование включено». Но я не понимаю, для чего санировать в шаблонах, когда это отключат в большинстве случаев.

Может быть, я не прав? Где я не прав?

Ответы [ 2 ]

2 голосов
/ 19 июня 2011

Используйте фильтр safe или тег шаблона autoescape off. Убедитесь, что вы понимаете, что такое XSS первым; пользовательский контент не должен считаться безопасным.

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

{{ body|safe }} является более коротким эквивалентом блока autoescape. Я понятия не имею, почему это не сработало, если только Т. Абило не прав и в хранилище данных уже нет html-цитирования.

TinyMCE сложно защитить от XSS, поскольку он отправляет вам презентационный html. Редакторы уценки (например, MarkItUp) проще, поскольку вы можете безопасно отрисовывать уценку на стороне сервера. Поскольку вам нужен фильтр, который удаляет все, кроме белого HTML-списка презентаций: {{ body|presentationalonly }}. Этот может сделать эту работу. Отбеливатель доступен для более строгих белых списков.

0 голосов
/ 19 июня 2011

У меня была похожая проблема, поэтому, возможно, вы могли бы проверить следующее:

  • - это разметка, отображаемая как "<p><" и т. Д. В вашем хранилище данных?
  • , если это так, вы можетедобавьте это в свой шаблон к строке .replace("&lt;", "<").replace("&gt;", ">"), все еще используя autoescape или что-то подобное
  • , если это работает, вы также можете изменить его непосредственно в своем обработчике, как описано здесь: http://wiki.python.org/moin/EscapingHtml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...