HTML消毒剂

html-sanitizer的Python项目详细描述


https://travis-ci.org/matthiask/html-sanitizer.svg?branch=master

这是一个基于allowlist的非常固执己见的html消毒剂 可用于不受信任和受信任的源。它试图清理 各种富文本编辑器和/或复制粘贴所造成的混乱 使网页的样式更简单和一致。它建立在 优秀的html清理程序在lxml中使结果既有效又安全。

html消毒剂比bleach更进一步,因为它不仅 确保内容安全,标签和属性符合给定的 allowList,但也对HTML片段应用其他转换。

目标

  • 使用一组非常有限的允许标记清理html片段 以及属性。
  • 转换一些标记(例如<span style="..."><b><i>)转换成<strong><em>(但不能同时转换成两者)。
  • 绝对不允许所有内联样式。
  • 通过删除重复的换行符来规范化空白,为空 段落和其他空元素。
  • 合并相同类型的相邻标记(例如几个<strong><h3>彼此紧随其后。
  • 自动删除<li>标记中的多余列表标记。
  • 清理一些丑陋的东西,例如段落或列表中的段落 元素等
  • 规范化Unicode。

用法

>>> from html_sanitizer import Sanitizer
>>> sanitizer = Sanitizer()  # default configuration
>>> sanitizer.sanitize('<span style="font-weight:bold">some text</span>')
'<strong>some text</strong>'

设置

  • 粗体跨距和b标记转换为strong标记,斜体 跨距和i标记转换成em标记(如果strongem是 完全允许)
  • 将始终删除内联样式和脚本。
  • 使用div元素包装解析器的html片段, 因此不允许使用div标记。

默认设置为:

DEFAULT_SETTINGS = {
    "tags": {
        "a", "h1", "h2", "h3", "strong", "em", "p", "ul", "ol",
        "li", "br", "sub", "sup", "hr",
    },
    "attributes": {"a": ("href", "name", "target", "title", "id", "rel")},
    "empty": {"hr", "a", "br"},
    "separate": {"a", "p", "li"},
    "whitespace": {"br"},
    "keep_typographic_whitespace": False,
    "add_nofollow": False,
    "autolink": False,
    "sanitize_href": sanitize_href,
    "element_preprocessors": [
        # convert span elements into em/strong if a matching style rule
        # has been found. strong has precedence, strong & em at the same
        # time is not supported
        bold_span_to_strong,
        italic_span_to_em,
        tag_replacer("b", "strong"),
        tag_replacer("i", "em"),
        tag_replacer("form", "p"),
        target_blank_noopener,
    ],
    "element_postprocessors": [],
    "is_mergeable": lambda e1, e2: True,
}

按键的含义如下:

  • tags:允许的标记的set()
  • attributes:将标记映射到其允许的属性的dict()
  • empty:允许为空的标记。默认情况下,空标记 (不包含文本或仅包含空白)将被删除。
  • separate:如果标记显示为同级标记,则不合并它们。由 默认情况下,合并相同类型的标记。
  • whitespace:被视为空白并从中删除的标记 其他标记内容的开始或结束。
  • keep_typographic_whitespace:保留排版使用的空格 不间断空格等字符。
  • add_nofollow:是否将rel="nofollow"添加到所有链接。
  • autolink:启用lxmlautolinker。可以是布尔值或 字典;字典作为关键字参数传递给 autolink
  • sanitize_href:获取锚的href值和 返回净化版本。默认实现检查 链接以几个允许的前缀开头,如果不是,则返回一个 散列(#)。
  • element_preprocessorselement_postprocessors:附加 对树中的所有元素调用的筛选器。这棵树是 按相反的深度一级处理。在某些情况下 元素被多次处理(在代码中搜索 backlog.append)。预处理器在空白之前运行 规范化,后处理器。
  • is_mergeable:不保留的相邻元素separate是 默认情况下合并。此可调用项可用于阻止 相邻元素,例如当它们的类不匹配时 (lambda e1, e2: e1.get('class') == e2.get('class')

初始化消毒液时可以部分指定设置 实例,但仍检查其一致性。例如,它不是 允许在empty中有不在tags中的标记,即, 允许为空但同时不允许为空的标记 全部。在以下情况下,Sanitizer构造函数引发TypeError异常 它检测不一致。

一个更受限制的配置示例可能是:

>>> from html_sanitizer import Sanitizer
>>> sanitizer = Sanitizer({
...     'tags': ('h1', 'h2', 'p'),
...     'attributes': {},
...     'empty': set(),
...     'separate': set(),
... })

这种限制性允许标签集的基本原理(例如 图片)在 django-content-editor的文档。

django

html消毒剂不依赖于django,而是附带一个模块 使使用django设置配置消毒剂更容易。用法如下 如下:

>>> from html_sanitizer.django import get_sanitizer
>>> sanitizer = get_sanitizer([name=...])

可以配置不同的消毒剂。默认配置为 恰当地命名为'default'。示例设置如下:

HTML_SANITIZERS = {
    'default': {
      'tags': ...,
    },
    ...
}

'default'配置是特殊的:如果它不是显式的 定义后,将使用上面的默认配置。不存在的 配置将导致ImproperlyConfigured异常。

get_sanitizer函数缓存消毒剂实例,请随意使用 想怎么叫就怎么叫。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在一个问题被连续正确回答三次/并添加差异后,我如何将程序循环回开始   Java中未实例化的匿名类   java如何在Android中录制视频,只允许横向模式和最长时间录制时间   java从另一个活动发送实时消息   多线程java线程和互斥   java禁用Spring安全日志   JAVA伊奥。StreamCorruptedException:在与子级和父级ProcessBuilder通信时写入子级中的标准输出时,流头无效   使用Java(HttpURLConnection)对Restheart进行身份验证(对于Mongodb)   java如何解决Jenkins中的SAXParseException?   java为什么我需要mockito来测试Spring应用程序?   计算sin-cos和tan时缺乏精度(java)   java Hibernate。不同项目中相同一对一映射的不同行为   java图像滑块:如何使用JavaFX将图像放在另一个图像上   java Mockito在使用when时抛出NotAMockException   http Java servlet发送回响应