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


Necesito permitir que los usuarios ingresen contenido Markdown en mi aplicación web, que tiene un back-end de Python. No quiero restringir innecesariamente sus entradas (por ejemplo, no permitiendo ningún HTML, lo que va en contra del espíritu y las especificaciones de Markdown), pero obviamente necesito evitar ataques de cross-site scripting (XSS).

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

¿Qué es una mejor práctica ¿cómo procesar Markdown y prevenir ataques XSS usando bibliotecas Python? (Puntos de bonificación por soportar sintaxis PHP Markdown Extra .)

Author: Alan H., 2011-03-11

2 answers

No pude determinar la "mejor práctica", pero generalmente 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 manera ingenua, esto puede invitar a ataques XSS).

  2. Simplemente trata cualquier HTML como texto sin formato, esencialmente dejando que tu procesador Markdown escape de la entrada del usuario. Por lo tanto, <small>…</small> in input 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 en texto como <3 dependiendo de la implementación. Este es el enfoque adoptado aquí en Stack Overflow.

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

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

  1. Markdown para Python, que opcionalmente soporta sintaxis adicional y luego a través de
  2. el desinfectante de html5lib .

Lancé un montón de intentos de ataque XSS a esta combinación, y todos fallaron (¡hurra !); pero usar etiquetas benignas como <strong> funcionó perfectamente.

De esta manera, en efecto va con la opción #1 (como se desee), excepto para fragmentos HTML potencialmente peligrosos o mal formados, que se tratan como en la opción #2.

(Gracias a Y. H Wong por señalarme en la dirección de ese Markdown la biblioteca!)

 20
Author: Alan H.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-08 20:34:53

Markdown en Python es probablemente lo que estás buscando. Parece cubrir muchas de sus extensiones solicitadas también.

Para evitar ataques XSS, la forma preferida de hacerlo es exactamente la misma que la de otros lenguajes: se escapa de la salida del usuario cuando se procesa de nuevo. Acabo de echar un vistazo a la documentación y al código fuente . Markdown parece ser capaz de hacerlo desde el primer momento con algunos ajustes de configuración triviales.

 1
Author: Y.H Wong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-10 22:12:30