Libxml Cleaner将不需要的<p>标记添加到HTML片段</p>

时间:2011-06-23 02:46:04

标签: python parsing libxml2

我正在尝试使用libxml的HTML清理程序清理用户输入以防止XSS注入。当我输入这样的字符串时:

Normal text <b>Bold text</b>

我得到了这个:

<p>Normal text <b>Bold text</b></p>

我想摆脱围绕我所有输入的<p>标记。


以下是目前正在进行清洁的功能:

from lxml.html import clean

cleaner = clean.Cleaner(
    scripts = True,
    javascript = True,
    allow_tags = None,
)

def sanitize_html(html):
    return cleaner.clean_html(html)

在不相关的说明中,上面的代码有一行:allow_tags = None我试图删除所有HTML标记。 libxml是否具有白名单功能,我允许某些标记?

1 个答案:

答案 0 :(得分:3)

所有TEXT个片段/节点必须包含在某种元素中。 libxml会尽力解决此问题。

def sanitize_html(html):
    cleaned_html = cleaner.clean_html(html)
    return re.sub(r'</p>$', '', re.sub(r'^<p>', '', cleaned_html))

缓存已编译的正则表达式或找到更有效的方法,这样做可以留给观众。如果不重新检查libxml2,我认为你可以获得一个切片:

return cleaned_html[3:-4]     # Single slice operation
return cleaned_html[3:][:-4]