Django模板-只将某些HTML标记标记为安全

mnemlml8  于 2022-12-05  发布在  Go
关注(0)|答案(1)|浏览(158)

bounty将在5天后过期。回答此问题可获得+100的声望奖励。OhMad正在寻找来自知名来源的答案

我有以下使用案例:用户应该能够在HTML输入中输入,并且应该显示为HTML输入。但是,它只能包含<br>, <italic>, <strong>, <ul> or <li>标记。
我知道安全过滤器,但这样它将允许每一个HTML输入,并倾向于XSS。
你知道我该怎么解决吗?
谢谢你!

fkvaft9z

fkvaft9z1#

我们可以创建一个只允许某些标签的验证器,例如 BeautifulSoup

from bs4 import BeautifulSoup
from bs4.element import Tag
from django.core.exceptions import ValidationError
from django.utils.deconstruct import deconstructible

@deconstructible
class HtmlValidator:
    def __init__(self, tags=()):
        self.tags = tags

    def validate(self, node):
        if isinstance(node, Tag):
            if node.name not in self.tags:
                raise ValidationError(f'Tag {node.name} is not a valid tag')
            for child in node:
                self.validate(child)

    def __call__(self, value):
        soup = BeautifulSoup(value, 'html.parser')
        for child in soup:
            self.validate(soup)

然后我们可以将这样的验证器添加到模型中:

class MyModel(models.Model):
    content = models.CharField(
        max_length=1024,
        validators=[HtmlValidator(tags={'br', 'italic', 'strong', 'ul', 'li'})],
    )
    # …

相关问题