python xss markdown sanitization

¿Mejores prácticas para permitir Markdown en Python, mientras se previenen los ataques XSS?



sanitization (2)

Debo permitir que los usuarios ingresen contenido de Markdown a mi aplicación web, que tiene un servidor de Python. No quiero restringir innecesariamente sus entradas (por ejemplo, al no permitir ningún HTML, lo que va en contra del espíritu y la especificación de Markdown), pero obviamente necesito evitar ataques de scripts entre sitios (XSS).

No puedo ser el primero con este problema, pero no vi ninguna pregunta de SO con todas las palabras clave "python", "Markdown" y "XSS", así que aquí va.

¿Cuál es la mejor manera de procesar Markdown y prevenir ataques XSS utilizando bibliotecas de Python? (Puntos de bonificación por soportar la sintaxis de PHP Markdown Extra ).


No pude determinar la "mejor práctica", pero en general tiene tres opciones al aceptar la entrada de Markdown:

  1. Permitir HTML dentro del contenido de Markdown (así es como Markdown funciona originalmente / oficialmente, pero si se trata de forma ingenua, puede invitar a los ataques XSS).

  2. Simplemente trate cualquier HTML como texto simple, esencialmente dejando que su procesador Markdown escape de la entrada del usuario. Por lo tanto, <small>…</small> en la entrada no creará texto pequeño, sino el texto literal " <small>…</small> ".

  3. Deseche todas las etiquetas HTML dentro de Markdown. Esto es bastante hostil para el usuario y puede ahogarse con un texto como <3 dependiendo de la implementación. Este es el enfoque adoptado aquí en .

Mi pregunta se refiere al caso # 1, específicamente.

Dado que, lo que funcionó bien para mí es enviar comentarios del usuario a través de

  1. Markdown for Python , que opcionalmente admite sintaxis Extra y luego a través de
  2. html5lib de html5lib .

Tiré un montón de intentos de ataque XSS en esta combinación, y todos fallaron (¡hurra!); pero el uso de etiquetas benignas como <strong> funcionó a la perfección.

De esta manera, en efecto, va con la opción # 1 (según lo deseado), excepto los fragmentos de código HTML potencialmente peligrosos o mal formados, que se tratan como en la opción # 2.

(¡Gracias a YH Wong por indicarme la dirección de esa biblioteca de Markdown!)


Markdown en Python es probablemente lo que estás buscando. También parece cubrir muchas de las extensions solicitadas.

Para evitar los ataques XSS, la forma preferida de hacerlo es exactamente la misma que en otros idiomas: se escapa de la salida del usuario cuando se devuelve. Acabo de echar un vistazo a la documentation y el source fuente. Markdown parece poder hacerlo de inmediato con algunos ajustes triviales de configuración.