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

Опитвам се да дезинфекцирам въведеното от потребителя, за да предотвратя инжектиране на XSS с помощта на HTML cleaner на 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