Лучший способ разрешить Markdown в Python, одновременно предотвращая атаки XSS? - PullRequest
25 голосов
/ 11 марта 2011

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

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

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

Ответы [ 2 ]

20 голосов
/ 19 марта 2011

Мне не удалось определить «наилучшую практику», но, как правило, у вас есть три варианта принятия ввода уценки:

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

  2. Просто относитесь к любому HTML как к простому тексту, позволяя процессору Markdown избегать ввода пользователя. Таким образом, <small>…</small> при вводе будет создавать не маленький текст, а буквальный текст «<small>…</small>».

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

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

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

  1. Уценка для Python , которая дополнительно поддерживает дополнительный синтаксис и затем через
  2. html5lib 's sanitizer .

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

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

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

2 голосов
/ 11 марта 2011

Уценка в Python , вероятно, то, что вы ищете. Похоже, что он покрывает и многие запрошенные расширения .

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

...