2015-09-26 7 views
4

После прочтения документа mark_safe() все еще кажется мифом. Я думаю, это связано с CSRF. Но зачем и когда использовать mark_safe()?Зачем и когда использовать функцию Django mark_safe()

Вот в документации по

mark_safe (s) [источник] ¶

Явных пометить строку как безопасную для выходных целей (HTML). Возвращаемый объект может использоваться везде, где подходит строка или объект unicode.

Можно вызывать несколько раз на одной строке.

Для создания фрагментов HTML, вы обычно должны использовать django.utils.html.format_html().

Строка, маркированная безопасно, снова станет небезопасной, если она будет изменена. Например:

+0

Когда вы можете доверять контенту. I.Это не HTML, который был представлен пользователем. –

+0

В документах не упоминается CSRF, поэтому я не знаю, почему вы думаете, что это имеет какое-либо отношение к нему. –

ответ

7

Django - это структура, которая по умолчанию пытается сделать «правильную» вещь. Это означает, что когда вы делаете самую простую вещь, вы, возможно, делаете правильные вещи.

Теперь давайте посмотрим на некоторые шаблон в PHP и Python:

PHP:

<? echo $foo ?> 

Может дать:

<script src="evil"> 

Джанго:

{{ foo }} 

дает с тот же ввод:

&gt;script src="evil"&lt; 

Предположим, вы хотите разместить ссылку <a href="link">text</a>. Затем django отобразит его как текст, используя &lt;&gt;. Если вы знаете, что делаете, теперь вы можете использовать mark_safe, чтобы указать, что текст является надежным (т. Е. Не из пользовательского ввода).

Обычно вы используете {{ foo|safe }} или {% autoescape off %}{{ foo }}{% endautoescape %} в ваших шаблонах как программатор django, что более понятно, когда строка объявлена ​​безопасной.

Итак, где mark_safe б/у? Когда вы пишете собственные templatetags или фильтры, вам нужно пометить строку как безопасную от python, потому что разработчик предположит, что {{foo | mylinkifyfunction}} делает правильную вещь (т. Е. Избегает URL-адреса foo, но не убегает <a href=""></a> вокруг URL-адреса).

+0

Итак, mark_safe должен правильно отображать < & gt; и т. Д.? – day

+0

mark_safe сообщает шаблонам django, что строка должна использоваться как IS, из вашего кода на Python. Обычно это не то, что вы хотите. Вот пример [https://github.com/django/django/blob/222d0633010e2f37f9fbd2d0559ecc4a5643c738/django/template/defaultfilters.py # L481), где код python должен выводить ''
'' для шаблона, который не экранирован. – allo

Смежные вопросы