我正在尝试使用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是否具有白名单功能,我仅允许某些标记?
答案 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]