Libxml Cleaner добавляет нежелательный тег <p>к фрагментам HTML - PullRequest
5 голосов
/ 23 июня 2011

Я пытаюсь санировать ввод данных пользователем, чтобы предотвратить инъекцию XSS, используя HTML-очиститель libxml.Когда я ввожу строку, подобную этой:

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 Ответ

3 голосов
/ 23 июня 2011

Все 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]
...