フィルターについて聞いたことがあります|safe
が、正しく理解していれば安全ではなく、インジェクションのバックドアが作成されます。
書式設定されたテキストを含む完全な投稿を表示する代替手段は何ですか?
フィルターについて聞いたことがあります|safe
が、正しく理解していれば安全ではなく、インジェクションのバックドアが作成されます。
書式設定されたテキストを含む完全な投稿を表示する代替手段は何ですか?
のフィルターを使用しない場合、|safe
出力はhtmlマークアップのみのテキストとして返されるはずです(html出力としてレンダリングされません)。
ただし、 などの危険なタグを除外する必要がある場合は<script>location.reload()</script>
、カスタムの templatetag フィルターで処理する必要があります。
https://stackoverflow.com/a/699483/6396981から良い回答を得ましたBeautifulSoup
。
from bs4 import BeautifulSoup
from django import template
from django.utils.html import escape
register = template.Library()
INVALID_TAGS = ['script',]
def clean_html(value):
soup = BeautifulSoup(value)
for tag in soup.findAll(True):
if tag.name in INVALID_TAGS:
# tag.hidden = True # you also can use this.
tag.replaceWith(escape(tag))
return soup.renderContents()
# clean_html('<h1>This is heading</h1> and this one is xss injection <script>location.reload()</script>')
# output:
# <html><body><h1>This is heading</h1> and this one is xss injection <script>location.reload()</script></body></html>
@register.filter
def safe_exclude(text):
# eg: {{ post.description|safe_exclude|safe }}
return clean_html(text)
それが役に立つことを願っています..