1

フィルターについて聞いたことがあります|safeが、正しく理解していれば安全ではなく、インジェクションのバックドアが作成されます。

書式設定されたテキストを含む完全な投稿を表示する代替手段は何ですか?

4

1 に答える 1

1

のフィルターを使用しない場合、|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 &lt;script&gt;location.reload()&lt;/script&gt;</body></html>

@register.filter
def safe_exclude(text):
    # eg: {{ post.description|safe_exclude|safe }}
    return clean_html(text)

それが役に立つことを願っています..

于 2017-01-03T00:21:33.557 に答える