Уметь анализировать HTML не означает уметь безопасно отображать HTML
В этой статье поясняется, что BeautifulSoup позиционируется только как анализатор, а не как средство очистки безопасности, и демонстрируется, как удалять события сценариев и опасные URL-адреса с помощью стратегии белого списка. Содержит работоспособный учебный код по очистке памяти, примеры граничного тестирования и критерии запуска проверки вручную, а также объясняет правильный способ интеграции OmniDoc в рабочий процесс перевода документов для оценки возможностей обработки смешанного контента.
BeautifulSoup успешно анализирует HTML, но это не означает, что HTML безопасен. Для разработчиков и групп документации, которым необходимо обрабатывать внешний HTML, в этой статье объясняется, почему парсеры и очистители следует рассматривать отдельно, а также дается набор идей по очистке белых списков, тестовые примеры и критерии ручной проверки.
Примеры в этой статье представляют собой синтетические образцы и используются только для демонстрации методов обработки. Код был проверен на образцах в изолированной среде, но это не означает, что он гарантированно будет работать со всеми реальными файлами или продуктами. Перед обработкой важных документов сохраните оригиналы и затем просмотрите их один за другим в соответствии с границами и пунктами приемки, указанными в документе.
##Вывод в одном предложении: После анализа чистку нужно делать отдельно
Опасные атрибуты, такие как <img src=x onerror=alert(1)>, остаются нетронутыми в выходных данных после того, как BeautifulSoup их анализирует. Очистка должна представлять собой дополнительный уровень бизнес-логики, накладываемый после синтаксического анализа.
| твоя ситуация | Рекомендуемые практики | причина |
|---|---|---|
| Просто извлеките или измените данные из HTML | Использование BeautifulSoup для анализа и обхода | BS4 предназначен для извлечения и изменения древовидных структур. |
| Для встраивания внешнего HTML во внутренние системы или перевода результатов | Добавить слой очистки белого списка после анализа | BS4 не определяет, безопасны ли теги и атрибуты. |
Встречаются такие свойства, как onclick, javascript: или data:. | Удалите атрибуты или оставьте href пустым. | Эти свойства могут содержать исполняемый контент. |
| Готов к производству | Используйте специальную библиотеку очистки (например, bleach) и экспортируйте белый список. | Пример кода не охватывает такие детали, как многозначные атрибуты, нормализация регистра, кодирование сущностей и т. д. |
| Результаты очистки ненормальны или текст внезапно уменьшается. | Перейти к проверке вручную | Автоматизированные правила не могут охватить все реальные ситуации. |
Несоответствие между аналитическими возможностями и обязанностями по обеспечению безопасности
BeautifulSoup Официальная документация определяет ее как «библиотеку для извлечения данных из файлов HTML и XML» с упором на навигацию, поиск и изменение древовидных структур. Таким образом, он нейтральен в отношении семантической безопасности контента. При вводе <a href="javascript:void(0)">Click</a> BS4 правильно построит объект Tag с атрибутом href, но не определит, разрешен ли протокол.
В обработке документов такая нейтральность имеет свои плюсы и минусы. Преимущество состоит в том, что он может обрабатывать множество нерегулярных исторических маркеров. Риск заключается в том, что если разработчики посчитают, что «обработано BS4» равно «очищено», непроверенный HTML может попасть непосредственно в интерфейс предварительного просмотра или в готовый перевод.
Реальная очистка безопасности требует четкой стратегии белого списка: сохраняйте только известные безопасные имена тегов и атрибутов, проверяйте формат значений атрибутов и удаляйте все остальное. Это не встроенная функция BS4, а скорее логика, которую пользователи должны использовать самостоятельно.
Ввод границы в примере синтеза
Чтобы проиллюстрировать необходимость очистки, ниже используется набор синтетических образцов, охватывающих типичные векторы атак и законный контент. Эти входные данные предназначены только для демонстрации граничных условий и не являются реальной статистикой трафика и не представляют собой стандартные пороговые значения. Чтобы протестировать настоящие документы, сначала десенсибилизируйте свои бизнес-данные, удалив личную информацию и конфиденциальные ссылки.
Введите правильно
<p>See <a href="https://example.com/doc">reference</a>.</p>
Ожидаемый вывод должен оставить абзацы и ссылки нетронутыми, поскольку p и a занесены в белый список, а href использует протокол HTTPS.
Граничный вход 1: обработчик событий
<div onclick="steal()">Safe text</div>
Несмотря на то, что текст безвреден, onclick является атрибутом обработчика событий и его необходимо полностью удалить, оставив только <div>Safe text</div>. Если div нет в белом списке тегов, весь тег следует заменить текстовым содержимым.
Граничный вход 2: данные: протокол
<a href="data:text/html,<script>alert(1)</script>">Link</a>
data: URI может передавать исполняемый контент. Даже если сам тег валиден, href следует оставить пустым или удалить. Очиститель не только проверяет, является ли префикс протокола http, но и проверяет, является ли декодированное содержимое вложенным контекстом выполнения.
Эти случаи иллюстрируют то, что решения о безопасности принимаются на этапе проверки на уровне атрибутов после разрешения. BS4 отвечает за превращение строк в проходимые объекты, а логика очистки определяет, какие объекты можно сохранять.
Очистка памяти на основе белого списка
Следующий пример на Python демонстрирует, как завершить этот процесс в памяти. Этот код предназначен только для обучения демонстрации и не охватывает многозначные атрибуты, нормализацию падежа, кодирование сущностей или другие детали. Прямое использование в производственных средах строго запрещено. Это зависит от beautifulsoup4, поэтому нужно установить его самостоятельно, и рекомендуется заблокировать версию. Код не инициирует сетевые запросы, а также не читает и не записывает в файловую систему. Эти утверждения выражают только ожидаемое поведение; реальные результаты зависят от вашей среды и зависимостей.
# 教学示例:演示BS4配合白名单清洗原理,非生产级实现
from bs4 import BeautifulSoup, Comment
import re
ALLOWED_TAGS = {'p', 'a', 'b', 'i', 'ul', 'li'}
ALLOWED_ATTRS = {'href'}
SAFE_URL_PATTERN = re.compile(r'^https?://', re.IGNORECASE)
def sanitize_html(raw: str) -> str:
soup = BeautifulSoup(raw, 'html.parser')
# 移除注释
for comment in soup.find_all(string=lambda t: isinstance(t, Comment)):
comment.extract()
# 遍历所有标签
for tag in soup.find_all(True):
if tag.name not in ALLOWED_TAGS:
tag.unwrap() # 保留子节点,移除标签本身
continue
# 清理属性
attrs_to_remove = [k for k in tag.attrs if k not in ALLOWED_ATTRS]
for attr in attrs_to_remove:
del tag[attr]
# 校验剩余安全属性值
if 'href' in tag.attrs:
href = tag['href']
if not isinstance(href, str) or not SAFE_URL_PATTERN.match(href.strip()):
del tag['href']
return str(soup)
# 合成测试用例(仅用于理解原理)
safe = '<p>Hello <a href="https://ok.com">link</a></p>'
unsafe_event = '<p onclick="x()">text</p>'
unsafe_uri = '<a href="javascript:alert(1)">bad</a>'
assert sanitize_html(safe) == '<p>Hello <a href="https://ok.com">link</a></p>'
assert 'onclick' not in sanitize_html(unsafe_event)
assert 'href' not in sanitize_html(unsafe_uri)
В производственных средах можно рассмотреть использование выделенных библиотек очистки (например, bleach) и размещение конфигураций белого списка вне кода. Главное в том, что логика очищения должна явно указывать «что разрешено», а не пытаться перечислить «что запрещено».
Критерии принятия и триггерные точки для ручной проверки
Утверждения в коде могут только проверять, выполняются ли предустановленные правила, и не могут охватывать все реальные аномалии. В таблице ниже перечислены распространённые ситуации в реальной обработке документов, а также границы между автоматизированной обработкой и вмешательством человека.
| Наблюдайте за этим явлением | Автоматические решения по обработке | Требуется ли ручное рассмотрение | Примечание |
|---|---|---|---|
| Имена тегов отсутствуют в белом списке, но содержат важный текст | Unwrap сохраняет текст | Нет | Убедитесь, что семантика не теряется |
| href — это относительный путь или mailto: | Удалить атрибут href | Да | Это может быть действительной бизнес-ссылкой и требуется ручное подтверждение |
| Значение свойства содержит JS, закодированный HTML-сущностью | Отклонение по строчному совпадению | Да | Необходимо подтвердить, было ли это непредумышленное убийство |
| Слишком глубокие слои вложения вызывают тайм-ауты разрешения | Вырезать или пропустить клип | Да | Предотвращает DoS, но может потерять контент |
| Длина текста резко сокращается на >30% после очистки | Марк — подозрительный | Да | Он может чрезмерно убрать структурированную информацию |
«Демонстрация кода прошла» не означает, что «эффект от поворота до конца заслуживает доверия». Для проектов, отмеченных «Да» в таблице, автоматизированный процесс следует приостановить и передать на ручное рассмотрение. В сценариях передачи перевода чрезмерная очистка может привести к разрывам цитирования терминологии или неправильным форматированием.
📊 Сравнение ядра
| Метод | Что можно сделать? | Он ничего не может заменить |
|---|---|---|
| КрасиваяРазбор супа | Превратите HTML в обходимую и изменяемую древесную структуру | Суждения, атрибуты и протоколы безопасности останутся без изменений |
| Слой очистки белого списка | Явно объявляйте разрешённые метки и атрибуты, убирая остальное | Ручная проверка, статус границ всё ещё требует подтверждения |
Специализированные камеры очистки (например, bleach) | Осуществляет очистку производственного уровня и поддерживает внешнюю конфигурацию | Сортировка и принятие белого списка вашего бизнеса |
🎯 Какой способ тебе подходит?
Если вам нужно только извлечь данные
Просто используйте BeautifulSoup напрямую, но не показывайте его выход так, будто он был продезинфицирован.
Если вы хотите отображать внешний или исторический наследный HTML
Сначала создайте слой очистки белого списка, затем протестируйте каждый товар согласно листу приема.
Если вы готовитесь к производству
Рассмотрите возможность использования специализированных библиотек, таких как bleach, настройте белые списки внешне и сохраняйте правила ручного триггера проверки.
Если хочешь заниматься переводом и доставкой документов
Проверьте основной текст, ссылки, код и структуру отдельно, а также организуйте ручную проверку элементов, отмеченных в таблице.
❓ Часто задаваемые вопросы (FAQ)
1. После парсинга и повторной сериализации с помощью BeautifulSoft, исчезнет ли вредоносный код?
Нет. Пример в статье показывает, что <img src=x onerror=alert(1)> всё ещё полностью сохраняется на выходе после разбора и сериализации.
2. Как работать с тегами и атрибутами вне белого списка?
Если тега нет в белом списке, вы можете развернуть его, чтобы сохранить его текст; Атрибуты процессора событий, такие как onclick, должны быть полностью удалены.
3. Можно ли использовать примерный код напрямую в производственных средах?
Нет, ты не можешь. Примеры предназначены только для обучающих демонстраций и не затрагивают такие детали, как многозначные атрибуты, нормализация падежей, кодирование сущностей и т.д. Производственные среды могут учитывать bleach, а белые списки можно настраивать внешне.
4. Если демонстрация кода пройдёт, значит ли это, что эффект обработки заслуживает доверия?
Так нельзя делать выводы. Если форма выдана и требует ручного рассмотрения, автоматизированный процесс должен быть приостановлен, а ручной просмотр будет разрешен.
5. Можно ли тестировать напрямую с реальными файлами?
Рекомендуется сначала десенсибилизировать бизнес-данные, удалить личную информацию и чувствительные ссылки, а затем пройти тестирование по критериям приема.
Используйте чек-листы для перевода документов
Основной текст, ссылки, код и структура веб-страниц должны рассматриваться отдельно. Включите защищённые разделы в чек-лист приёма, а затем оцените читаемость и отображение страницы после перевода.
OmniDoc (запись продукта) предоставляет многоформатные порталы для перевода документов, а на её официальном сайте представлены OCR, глоссарии и билингвальные справочные функции. Для команд, которые хотят начинать напрямую с файлов, этот путь стоит оценивать с помощью реальных образцов. Пожалуйста, используйте анонимный файл, который вы разрешили загрузить, и проверьте результаты с помощью чек-листа в этой статье. Это не утверждает, что OmniDoc использует открытые библиотеки или внутренние алгоритмы, упомянутые в этой статье, и примеры не заменяют тестирование производительности продукта.
📝 Краткое содержание
Парсинг отвечает только на вопрос «Как выглядит HTML?»; безопасность зависит от белого списка и ручной проверки. Сначала запустите примеры в заблокированной среде зависимостей, затем протестируйте каждый элемент с десенсибилизированными образцами согласно листу приема и, наконец, решите, интегрироваться ли в формальный процесс.
Опыт сейчас: загрузите документ, чтобы начать перевод, сохраняя оригинальное форматирование


