Подтвердить что ты не робот

Лучшая практика разрешения Markdown на Python, предотвращая атаки XSS?

Мне нужно разрешить пользователям вводить контент Markdown в мое веб-приложение, которое имеет конец Python. Я не хочу бесполезно ограничивать свои записи (например, не позволяя HTML, что противоречит духу и спецификации Markdown), но, очевидно, мне нужно предотвратить атаки на межсайтовый скриптинг (XSS).

Я не могу быть первым с этой проблемой, но не видел никаких вопросов SO со всеми ключевыми словами "python", "Markdown" и "XSS", поэтому здесь идет.

Каков наилучший способ обработки Markdown и предотвращения атак XSS с использованием библиотек Python? (Бонусные баллы за поддержку PHP Markdown Extra.

4b9b3361

Ответ 1

Мне не удалось определить "лучшую практику", но обычно у вас есть три варианта при принятии ввода Markdown:

  • Разрешить HTML в содержимом Markdown (так как Markdown изначально/официально работает, но если он наивно, он может приглашать атаки XSS).

  • Просто рассматривайте любой HTML как обычный текст, по сути, позволяя вашему процессору Markdown избежать ввода пользователей. Таким образом, <small>…</small> на входе не будет создавать небольшой текст, а скорее буквальный текст "<small>…</small>".

  • Выбросьте все теги HTML в Markdown. Это довольно вредно для пользователя и может захлебываться как текст <3 в зависимости от реализации. Это подход, применяемый здесь к переполнению стека.

Мой вопрос касается случая № 1, в частности.

Учитывая, что то, что сработало хорошо для меня, отправляет пользовательский ввод через

Я бросил кучу попыток атаки XSS в эту комбинацию, и все не удалось (ура!); но использование доброкачественных тегов, таких как <strong>, работало безупречно.

Таким образом, вы действуете с опцией # 1 (по желанию), за исключением потенциально опасных или некорректных фрагментов HTML, которые рассматриваются как в опции № 2.

(Спасибо Y.H Wong за то, что указали мне в сторону этой библиотеки Markdown!)

Ответ 2

Markdown в Python - это, вероятно, то, что вы ищете. Похоже, что он покрывает многие ваши запрошенные extensions.

Чтобы предотвратить атаки XSS, предпочтительный способ сделать это точно так же, как и другие языки - вы избегаете выхода пользователя при возврате назад. Я просто заглянул в документацию и источник, Markdown, похоже, может сделать это прямо из коробки с некоторыми тривиальными настройками конфигурации.