PHP: лучшие практики в отношении «публичной» видимости в ООП

Короткая версия!
import re, cgi
tag_re = re.compile(r'(|<[^>]*>)')

# Remove well-formed tags, fixing mistakes by legitimate users
no_tags = tag_re.sub('', user_input)

# Clean up anything else by escaping
ready_for_web = cgi.escape(no_tags)

Источник регекса: MarkupSafe .

Почему я не могу просто удалить теги и оставить его?

Одно дело, чтобы люди не могли italicizing, не оставляя i s плавающим вокруг. Но другое - принимать произвольные данные и сделать их совершенно безвредными. Большинство методов на этой странице оставят такие вещи, как закрытые комментарии ( src=x onerror=alert(1);//>

В первый раз, когда HTMLParser видит это, он не может сказать, что является тегом. Он выглядит сломанным, поэтому HTMLParser не избавляется от него. Он извлекает только , оставляя вас с


. Эта проблема была раскрыта в проекте Django в марте 2014 года. Их старый strip_tags был по существу тем же самым, что и верхний ответ на этот вопрос. Их новая версия в основном запускает ее в цикле до тех пор, пока ее запуск снова не изменит строку:

# _strip_once runs HTMLParser once, pulling out just the text of all the nodes.

def strip_tags(value):
    """Returns the given HTML with all tags stripped."""
    # Note: in typical case this loop executes _strip_once once. Loop condition
    # is redundant, but helps to reduce number of executions of _strip_once.
    while '<' in value and '>' in value:
        new_value = _strip_once(value)
        if len(new_value) >= len(value):
            # _strip_once was not able to detect more tags
            break
        value = new_value
    return value

Конечно, ни одна из этих проблем не является проблемой, если вы всегда избегаете результат strip_tags().

Обновление 19 марта 2015 г. В версиях Django произошла ошибка до 1.4.20, 1.6.11, 1.7.7 и 1.8c1. Эти версии могут вводить бесконечный цикл в функцию strip_tags (). Исправленная версия воспроизводится выше. Подробнее здесь .

Хорошие вещи для копирования или использования

Мой примерный код не обрабатывает HTML-объекты - это пакеты в Django и MarkupSafe.

Мой примерный код вытащил из превосходной библиотеки MarkupSafe для предотвращения межсайтового скриптинга. Это удобно и быстро (с ускорением C к его родной версии Python). Он включен в Google App Engine и используется Jinja2 (2.7 и выше) , Mako, Pylons и т. Д. Он легко работает с шаблонами Django из Django 1.7.

Django strip_tags и другие утилиты html из последней версии хороши, но я считаю их менее удобными, чем MarkupSafe. Они довольно самодостаточны, вы можете скопировать то, что вам нужно из этого файла .

Если вам нужно удалить почти все теги, [] g8] Библиотека Bleach хороша. Вы можете заставить его применять такие правила, как «мои пользователи могут выделять курсивом, но они не могут создавать iframes».

Поймите свойства вашего стриптизера тегов! Запустите тесты Fuzz! Вот код , который я использовал для исследования этого ответа.

sheepish note - Сам вопрос касается печати на консоли, но это является лучшим результатом Google для «python strip html from string», поэтому именно этот ответ составляет 99% в Интернете.

0
задан MrZiggyStardust 29 April 2013 в 11:09
поделиться