HTML消毒剂
html-sanitizer的Python项目详细描述
这是一个基于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标记(如果strong和em是 完全允许)
- 将始终删除内联样式和脚本。
- 使用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:启用lxml的autolinker。可以是布尔值或 字典;字典作为关键字参数传递给 autolink。
- sanitize_href:获取锚的href值和 返回净化版本。默认实现检查 链接以几个允许的前缀开头,如果不是,则返回一个 散列(#)。
- element_preprocessors和element_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函数缓存消毒剂实例,请随意使用 想怎么叫就怎么叫。