Преобразование HTML в безопасный текст в Python: cgi.escape
Быстрый ответ
Заботьтесь о безопасности: используйте функцию Python html.escape()
для экранирования HTML-кода. Это поможет избавиться от проблем с HTML-инъекциями.
import html
safe_html = html.escape("<script>alert('x')</script>")
# safe_html: <script>alert('x')</script>
Усиление защиты: работа с кавычками и символами ASCII
В контексте HTML-атрибутов параметр quote=True
позволит избежать проблем со стандартными двойными кавычками ("
), преобразуя их в безопасные "
.
import html
safe_attribute = html.escape('"Hello, world!"', quote=True)
# safe_attribute: "Hello, world!"
Если вы сталкиваетесь с символами за пределами ASCII-диапазона, их можно перекодировать так:
data = "© 2023 StackExchange"
safe_data = data.encode('ascii', 'xmlcharrefreplace')
# safe_data: b'© 2023 StackExchange'
В случае работы с содержимым в Unicode, данные следует сначала декодировать перед экранированием.
Более глубокое понимание: экранирование и кодирование
Важно различивать:
- Экранирование: это когда вы предпринимаете действия на благо безопасности.
- Кодирование: это изменение формы сообщения для обеспечения совместимости.
Будьте уверены, что кодировка вашего документа совпадает с той, что используется в html.escape()
. Так ваш код будет по-настоящему надёжным.
Визуализация
Корзина данных 🧺:
| <b>Сэндвич с арахисовым маслом и джемом</b> | <script>Атака муравьёв</script> | 🍇 Виноград |
Что, если мы защитим эту корзину данных с помощью html.escape()
из Python?
import html
safe_basket = html.escape(raw_data_basket)
В итоге получим:
Безопасная корзина 🧺⛓️:
| <b>Сэндвich с арахисовым маслом и джемом</b> | <script>Атака муравьёв</script> | 🍇 Виноград |
Никакие насекомые больше не потревожат ваш спокойный пикник данных!
Python 3.2+ и "устаревший" cgi.escape
В эпоху Python 3.2+ используйте html.escape()
. Устаревшую функцию cgi.escape()
оставьте в прошлом. Вот иллюстрация:
# 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-элементы.
from urllib.parse import quote
safe_url = quote("<Привет & Мир>")
# safe_url: %3CПривет%20%26%20Мир%3E
Главное правило безопасности с MarkupSafe
Если вам нужна дополнительная надёжность, используйте MarkupSafe
. Он эффективно справляется с перегрузкой методов и шаблонизацией.
from markupsafe import escape
escaped_html = escape("<Это безопасно & на высоте>")
# escaped_html: <Это безопасно & на высоте>
MarkupSafe — это эффективный инструмент, который можно настроить под свои потребности, изучив документацию.
Обработка символов вне ASCII: важное значение корректного выбора кодировки
Главное правило — это выбор правильной кодировки. Она становится вашим надёжным спасением при работе с не-ASCII символами:
data = "Crème brûlée"
safe_html = html.escape(data).encode('utf-8')
# safe_html: b'Crème brûlée'
Точность играет главную роль. Проверьте спецификацию кодировки в заголовках, чтобы убедиться в корректности кодировки.