Libxml Cleaner добавляет нежелательный тег ‹p› к фрагментам HTML

Я пытаюсь очистить пользовательский ввод, чтобы предотвратить внедрение 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 функция белого списка, где я только разрешаю определенные теги?


person Wylie    schedule 23.06.2011    source источник
comment
Какая именно проблема вызвана оставлением тегов <p>?   -  person Karl Knechtel    schedule 23.06.2011
comment
@Karl: я передаю очищенный вывод через Markdown, который игнорирует все, что находится в теге блочного уровня для форматирования. Это также противоречит другим моим правилам CSS.   -  person Wylie    schedule 23.06.2011


Ответы (1)


Все 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]
person Sean    schedule 23.06.2011
comment
Спасибо, что сообщили мне, что все должно быть закрыто, я не знал об этом. Мое решение на самом деле состояло в том, чтобы заключить текст в другой тег перед очисткой. - person Wylie; 27.06.2011