如何使用HTML标记显示文本? (我使用ckeditor)

时间:2016-12-30 16:14:47

标签: python django django-templates django-ckeditor

我听说过过滤器|safe,但如果我理解正确,那就不安全了,并为注射创造了一个后门。

使用带格式的文字显示完整帖子有哪些替代方法?

1 个答案:

答案 0 :(得分:1)

我认为当你不使用|safe的过滤器时,输出应仅以html标记(不呈现为html输出)的形式返回。

但是,如果您需要排除某些危险标记,例如<script>location.reload()</script>,则需要使用自定义模板标记过滤器处理它。

我从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)

希望它有用..