Преобразование HTML в безопасный текст в Python: cgi.escape

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Заботьтесь о безопасности: используйте функцию Python html.escape() для экранирования HTML-кода. Это поможет избавиться от проблем с HTML-инъекциями.

Python
Скопировать код
import html
safe_html = html.escape("<script>alert('x')</script>")
# safe_html: &lt;script&gt;alert('x')&lt;/script&gt;

Усиление защиты: работа с кавычками и символами ASCII

В контексте HTML-атрибутов параметр quote=True позволит избежать проблем со стандартными двойными кавычками ("), преобразуя их в безопасные &quot;.

Python
Скопировать код
import html
safe_attribute = html.escape('"Hello, world!"', quote=True)
# safe_attribute: &quot;Hello, world!&quot;

Если вы сталкиваетесь с символами за пределами ASCII-диапазона, их можно перекодировать так:

Python
Скопировать код
data = "© 2023 StackExchange"
safe_data = data.encode('ascii', 'xmlcharrefreplace')
# safe_data: b'&#169; 2023 StackExchange'

В случае работы с содержимым в Unicode, данные следует сначала декодировать перед экранированием.

Более глубокое понимание: экранирование и кодирование

Важно различивать:

  • Экранирование: это когда вы предпринимаете действия на благо безопасности.
  • Кодирование: это изменение формы сообщения для обеспечения совместимости.

Будьте уверены, что кодировка вашего документа совпадает с той, что используется в html.escape(). Так ваш код будет по-настоящему надёжным.

Визуализация

Корзина данных 🧺:
| <b>Сэндвич с арахисовым маслом и джемом</b> | <script>Атака муравьёв</script> | 🍇 Виноград |

Что, если мы защитим эту корзину данных с помощью html.escape() из Python?

Python
Скопировать код
import html
safe_basket = html.escape(raw_data_basket)

В итоге получим:

Безопасная корзина 🧺⛓️:
| &lt;b&gt;Сэндвich с арахисовым маслом и джемом&lt;/b&gt; | &lt;script&gt;Атака муравьёв&lt;/script&gt; | 🍇 Виноград |

Никакие насекомые больше не потревожат ваш спокойный пикник данных!

Python 3.2+ и "устаревший" cgi.escape

В эпоху Python 3.2+ используйте html.escape(). Устаревшую функцию cgi.escape() оставьте в прошлом. Вот иллюстрация:

Python
Скопировать код
# cgi.escape() – устаревший подход
import cgi
escaped_str = cgi.escape("<b>устаревшее</b>")

# html.escape() – современный подход
import html
escaped_str = html.escape("<b>рекомендованное</b>")

Экранирование URL: лидерство urllib

Для экранирования URL наиболее подходит urllib, превращающий URL в безопасный вариант, конвертируя HTML-элементы.

Python
Скопировать код
from urllib.parse import quote
safe_url = quote("<Привет & Мир>")
# safe_url: %3CПривет%20%26%20Мир%3E

Главное правило безопасности с MarkupSafe

Если вам нужна дополнительная надёжность, используйте MarkupSafe. Он эффективно справляется с перегрузкой методов и шаблонизацией.

Python
Скопировать код
from markupsafe import escape
escaped_html = escape("<Это безопасно & на высоте>")
# escaped_html: &lt;Это безопасно &amp; на высоте&gt;

MarkupSafe — это эффективный инструмент, который можно настроить под свои потребности, изучив документацию.

Обработка символов вне ASCII: важное значение корректного выбора кодировки

Главное правило — это выбор правильной кодировки. Она становится вашим надёжным спасением при работе с не-ASCII символами:

Python
Скопировать код
data = "Crème brûlée"
safe_html = html.escape(data).encode('utf-8')
# safe_html: b'Crème brûlée'

Точность играет главную роль. Проверьте спецификацию кодировки в заголовках, чтобы убедиться в корректности кодировки.