web-dev-qa-db-ja.com

Django=テンプレートのエスケープ

Djangoのテンプレートシステムには、htmlのコンテンツをエスケープするためのいくつかのオプション(フィルター)がありますが、初心者としては少し混乱します。簡単なブログを作成するためのチュートリアルに従っているとしましょう。ブログのコンテンツはエスケープする必要があります。編集しているのは自分だけなので、コンテンツを信頼しています。したがって、質問は{{ post.content|autoescape }}{{ post.content|escape }}、または{{ post.content|safe }} htmlに?

ありがとう

編集:特殊文字をhtmlエンティティに自動的に変換するには、どのフィルターを使用する必要がありますか?

編集2:私はちょうど自動エスケープが有効なフィルタではないことに気づいた。

32
user14412

HTMLエスケープは、Djangoテンプレートでデフォルトでオンになっています。

自動エスケープはタグです。フィルタではありません:

{% autoescape on %}
    {{ post.content }}
{% endautoescape %}

「エスケープ」フィルターは、文字列のHTMLをエスケープします。具体的には、次の置換を行います。

  • <は&lt;に変換されます
  • >は&gt;に変換されます
  • '(単一引用符)は&#39;に変換されます
  • "(二重引用符)は&quot;に変換されます
  • &は&amp;に変換されます

「force_escape」は、いくつかのコーナーケースを除いて「escape」とほぼ同じです。

「安全」フィルターは、コンテンツを安全とマークするため、エスケープされません(ブラウザーにそのまま送信されます)。

特殊文字をhtmlエンティティに自動的に変換するには、どのフィルターを使用する必要がありますか?

つまり、Ã&Atilde;に変換するようなことですか? utf-8エンコーディングを最後まで守り、それらを忘れてください。

45
Paulo Scardine

まず、コンテンツをエスケープする必要があります。特殊な文字(<、>、など)が必要かどうかは(データを入力する人であっても)わからないためです。

使用する構文は、エスケープの使用に不快であることを示しています。

この

{% autoescape on %}
    {{ content }}
{% endautoescape %}

これとまったく同じです

{{ content|escape }}

この

{{ content }}

これとまったく同じ<-edit:自動エスケープがオフの場合(Paulo Scardineに感謝)

{{ content|safe }} 

安全はそのような使用です:

{% autoescape on %}
    {{ content }}  <-- escape
    {{ content|safe }}  <-- not escape
{% endautoescape %}
22
BlueMagma

あなたの質問は、エスケープとは少し混乱していることを示しています。

エスケープは、HTMLタグなどの安全でない文字をエスケープバージョンに変換することで、スクリプトタグなどの悪意のあるコンテンツがサイトを破壊しないようにします。 Djangoは、デフォルトで、変数からテンプレートにレンダリングされたすべてのコンテンツに対してこれを行います。

あなたのコメントでは、あなたがあなたが望むのは変数をレンダリングすることだけであるコンテンツを編集している唯一の人だと思われますwithout自動エスケープ。したがって、そのためには、安全とマークする必要があります。ロット全体を_{% autoescape off %}...{% endautoescape %}_タグでラップするか、個々の変数で_{{ myvar|safe }}_フィルターを使用して、テンプレートでこれを行うことができます。または、テンプレートに渡す前に個々の変数でmark_safe(myvar)を呼び出すことにより、ビューでそれを行うことができます。

9
Daniel Roseman

エスケープを回避するには、「安全」を使用します( https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#safe ):

出力の前にさらにHTMLエスケープを必要としない文字列をマークします。自動エスケープがオフの場合、このフィルターは効果がありません。

エスケープするには「escape」を使用します( https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#escape ):

文字列のHTMLをエスケープします。

0
Tadeck