防止使用Python呈现某些HTML标记

时间:2015-08-21 23:44:01

标签: python html filter flask xss

说我有一个字符串:

string = '<img src="image.png"><input type=text>'

我有一个函数可以将字符串转换为HTML标记并删除所有标记,但<img>标记如下:

VALID_TAGS = ['img']

def sanitizeHTML(value):

    soup = BeautifulSoup(value)

    for tag in soup.findAll(True):
        if tag.name not in VALID_TAGS:
            tag.hidden = True

    return Markup(soup.renderContents())

如果我通过函数传递字符串,它将返回<img src="image.png">,因为这是唯一有效的HTML标记。

如您所见,<input>标记甚至不出现在字符串中。我如何在字符串中保留'<input type=text>'但不渲染它以使其显示为文本而不是HTML。

我该怎么做?感谢。

1 个答案:

答案 0 :(得分:3)

为此,我会使用bleach模块 - documentation here

Bleach负责清理HTML标签和HTML转义“不安全”标签。

以下是一个示例程序,说明了如何使用漂白剂:

#!/usr/bin/env python
from bs4 import BeautifulSoup
import bleach

def sanitizeHTML(value):
    soup = BeautifulSoup(bleach.clean(value,tags=VALID_TAGS,attributes=VALID_ATTRIBUTES),"html5lib")
    return soup.renderContents()

VALID_TAGS = ['img']
VALID_ATTRIBUTES = ['src']

string = '<img src="image.png"><input type=text>'
result = sanitizeHTML(string)

print result