web-dev-qa-db-ja.com

DjangoのTextFieldでHTMLエスケープを無効にする

モデルのTextFieldに書き込むときに、Djangoの自動HTMLエスケープをオフにするにはどうすればよいですか?

30
evgeniuz

Djangoの safe フィルターを使用するだけです。テンプレートでは、次のようにします。

{{ instance.my_text_field|safe }}
87
bjunix

これを行う1つの方法は、安全とマークされたデータを返す関数をモデルに配置することです。

from Django.utils.safestring import mark_safe 

class MyModel(models.Model): 
    my_textfield = models.TextField()

    def display_my_safefield(self): 
        return mark_safe(self.my_textfield)

次に、テンプレートで次を使用する必要があります。

{{ instance.display_my_safefield }}
17
Daniel Vassallo

より良いそれを行う方法は@DanielVassalloが説明した通りだと思います。

どうして?

このようにして、特にクロスサイトスクリプティングから保護するために、エスケープせずに表示するHTMLコードに対していくつかのセキュリティ操作を実行できます([〜#〜] xss [〜# 〜])。

たとえば、_my_textfield_にscriptタグが含まれているかどうかを確認できます。
その場合、インスタンスを悪意のあるものとしてマークし、エスケープバージョンの_my_textfield_(通常のDjango動作))を返します。
それ以外の場合は、_mark_safe_を使用して、safeとマークされたHTMLコードを返します。

ここに:

_from Django.utils.safestring import mark_safe 

class MyModel(models.Model): 
    my_textfield = models.TextField()
    is_malisious = models.BooleanField(default=False)

    def display_my_safefield(self):
        if '<script>' in self.my_textfield:
            self.is_malicious = True
            self.save()
            return self.my_textfield
        return mark_safe(self.my_textfield)
_

そして、これらすべてはデータベースへの移行を必要としません。

代替アプローチ

モデルのsave()メソッドをオーバーライドし、その中の悪意のあるコンテンツに対するチェックやその他の必要な操作を含めることで、このセキュリティ操作を実行できると思います。次に、保存されたコンテンツが安全であることを確認した場合は、@ bjunixソリューションを使用できます。

1
Ammar Alyousfi