Hacer que las plantillas HTML hechas por el usuario sean seguras

Quiero permitir que los usuarios creen pequeñas plantillas que luego represento en Django con un contexto predefinido. Supongo que la representación de Django es segura (hice una pregunta sobre esto antes ), pero todavía existe el riesgo de que se realicen secuencias de comandos entre sitios y me gustaría evitarlo. Uno de los requisitos principales de estas plantillas es que el usuario debe tener cierto control sobre el diseño de la página, no solo su semántica. Veo un par de soluciones:

Entonces, para resumir: ¿Existe alguna forma segura y fácil de “purificar” HTML, evitando xss, o existe un lenguaje de marcado bastante ubicuo que proporciona cierto control sobre el diseño y el estilo?

Recursos:

  • Mi pregunta anterior sobre las plantillas de Django
  • Nombres de clase en rebaja.

Hay un purificador de HTML basado en PHP, no lo he usado todavía, pero he oído cosas muy buenas sobre él. Prometen mucho:

HTML Purifier es una biblioteca de filtros HTML compatible con los estándares escrita en PHP. HTML Purifier no solo eliminará todo el código malicioso (mejor conocido como XSS) con una lista blanca bien auditada, segura pero permisiva, sino que también se asegurará de que sus documentos cumplan con los estándares, algo que solo se puede lograr con un conocimiento completo de las especificaciones de W3C.

Tal vez valga la pena intentarlo aunque no esté basado en Python. Actualización: @Matchu ha encontrado una alternativa basada en Python que también se ve bien.

Sin embargo, tendrá muchos casos de borde muy difíciles, solo piense en incrustaciones de Flash. Además, los usos maliciosos de la position: absolute son extremadamente difíciles de rastrear (existe una position: relative que podría lograr el mismo efecto, pero también puede ser una herramienta de diseño completamente legítima). Tal vez echar un vistazo a lo que, por ejemplo, EBay permite, y no permitir Si alguien tiene la experiencia necesaria para saber qué es peligroso y qué no proviene de millones de ejemplos, lo hacen.

Recursos relacionados en eBay:

  • HTML y JavaScript con ejemplos

  • La Interferencia del sitio no está claro, sin embargo, qué está prohibido y qué se filtra

Por lo que encontré, no parecen publicar sus listas negras internas de HTML, pero muestran un mensaje de error si se encuentra un código prohibido. (Probablemente sea un sabio movimiento por su parte, pero desafortunado para los propósitos de esta pregunta).

Al ver la respuesta de Pekka, traté de buscar rápidamente en Google un equivalente de purificador HTML en Python. Esto es lo que se me ocurrió: Python HTML Sanitizer . A primera vista, me parece bastante bien.

“Use un lenguaje de marcado que produzca HTML seguro”.

Claramente, el único enfoque sensato.

“El problema con esto es que la mayoría de los lenguajes de marcado no son muy potentes en cuanto al diseño”.

Falso.

“No hay forma de centrar los elementos en ReST”.

Falso.

Centrar es un estilo, una característica de CSS, no una característica de marcado.

  1. El deseo de centrar es asignar una clase CSS a un fragmento de texto. La directiva .. class:: hace esto.

  2. También puede definir su propia función de texto interpretado, si eso es necesario para especificar una clase en línea en una etiqueta de .

Usted está pasando por alto los problemas de seguridad del lado del servidor. Debe tener mucho cuidado de que los usuarios no puedan usar la importación de plantillas o incluir un mecanismo para acceder a los archivos a los que no tienen permiso.

El desafío más grande es evitar que el sistema de plantillas tenga infinitos bucles y recursiones. Esta es una amenaza obvia para el rendimiento del sistema, pero dependiendo de la implementación y la configuración de la implementación, es posible que el servidor nunca se agote. Con un número finito de hilos de Python a su disposición, las llamadas repetidas a una plantilla que se comporta mal podrían hacer que su sitio se caiga rápidamente.