Alinee el HTML de vista previa del editor WMD con la validación HTML del lado del servidor (por ejemplo, sin código JavaScript incrustado)

Hay muchas preguntas de desbordamiento de pila (p. Ej.Lista blanca, evitando XSS con control WMD en C # yWMD Markdown y del lado del servidor) acerca de cómo hacer un fregado del lado del servidor de Markdown producido por el editor WMD para garantizar que el HTML generado no contenga script malicioso, como este:

<img onload="alert('haha');" 
   src="http://www.google.com/intl/en_ALL/images/srpr/logo1w.png" />

Pero tampoco encontré una buena manera de tapar el agujero en el lado del cliente. La validación del cliente no es un reemplazo para la validación de depuración en el servidor, por supuesto, ya que cualquiera puede pretender ser un cliente y PUBLICARle un desagradable Markdown. Y si está limpiando el HTML en el servidor, un atacante no puede guardar el HTML incorrecto, por lo que nadie más podrá verlo más tarde y sus cookies serán robadas o las sesiones serán secuestradas por el script incorrecto. Por lo tanto, hay un caso válido que puede ser que no valga la pena aplicar las reglas sin script en el panel de vista previa de WMD también.

Pero imagine que un atacante encontró una manera de obtener Markdown malicioso en el servidor (por ejemplo, un feed comprometido de otro sitio o contenido agregado antes de que se solucionara un error XSS). Su lista blanca del lado del servidor aplicada al traducir Markdown a HTML normalmente evitaría que ese Markdown malo se muestre a los usuarios. Pero si el atacante puede hacer que alguien edite la página (por ejemplo, al publicar otra entrada diciendo que la entrada maliciosa tenía un enlace roto y pidiéndole a alguien que la arregle), entonces cualquiera que edite la página obtiene sus cookies secuestradas. Este es ciertamente un caso de esquina, pero aún así vale la pena defenderse.

Además, probablemente sea una mala idea permitir que la ventana de vista previa del cliente permita HTML diferente de lo que permitirá su servidor.

El equipo de Stack Overflow ha tapado este agujero al hacer cambios a WMD. ¿Cómo lo hicieron?

[NOTA: ya lo descubrí, pero requirió una depuración de JavaScript complicada, por lo que estoy respondiendo mi propia pregunta aquí para ayudar a otros que quieran hacer lo mismo].

Respuestas a la pregunta(2)

Su respuesta a la pregunta