2009-09-06 13 views
6

Los usuarios pueden editar "artículos" en mi aplicación. Cada artículo se masteriza en el DB y se envía al cliente como Markdown: lo convierto al lado del cliente HTML con Javascript.Sanitize Markdown in Rails?

Estoy haciendo esto para que cuando el usuario quiera editar el artículo pueda editar y PUBLICAR el Margen de regreso al servidor (ya que ya está en la página).

Mi pregunta es cómo desinfectar el Markdown que envío al cliente. ¿Puedo usar el complemento sanitize de Rails?

Además, ¿tiene alguna idea sobre este enfoque en general? Otra estrategia en la que pensé fue renderizar y desinfectar el HTML en el servidor, y llevar el Markdown al cliente solo si el usuario quiere editar el artículo.

Respuesta

4

sigo un par de directores:

  • tienda de lo que el usuario escribe
  • desinfectar en exhibición
  • solamente enviar datos que son necesarios

Eso me lleva a la arquitectura alternativa se sugerir:

  • st reducción del precio del mineral en la base de datos
  • de render, de reducción del precio/desinfectar, y enviar HTML al navegador
  • cuando (y si) el usuario elige "Editar", solicitar la reducción del precio en bruto desde el servidor a través de AJAX
  • si tengo una vista de "vista previa" durante la edición, intento usar el servidor para representar esto también (aunque es posible que deba eliminar este paso si es demasiado lento). Sin embargo, durante la vista previa, desinfectar puede no ser tan crítico.

Este ha sido mi enfoque y funciona muy bien.

0

No he utilizado Markdown en Rails, pero mi enfoque sería tomar el Markdown presentado y almacenarlo, así como una copia de él, renderizada y desinfectada en HTML, en la base de datos. De esta forma, no estará desperdiciando información en su desinfección, y no tendrá que volver a hacer el Markdown cada vez que quiera mostrar un artículo.

Rails 'sanitize helper debería hacer el trabajo. También hay una serie de complementos (como xss_shield y xss_terminate) que se pueden utilizar para incluir en la lista blanca de su salida, ¡solo para asegurarse de que no se olvide de desinfectar!

+0

Y cuando el usuario haga clic en "editar" en el artículo, descargue la fuente de reducción desde el servidor a través de AJAX. –

+0

Eso es correcto. De lo contrario, en su rebaja -> HTML desinfectado -> conversión de rebajas, puede perder datos que no debería. – nfm

+0

¿Por qué almacenar el HTML desinfectado? podría fácilmente usar el almacenamiento en memoria caché de fragmentos y luego caducar el caché en el cambio de marca. –

4

Las otras respuestas aquí son buenas, pero permítanme hacer algunas sugerencias sobre sanitización. Rails sanitizer incorporado es decente, pero no garantiza la buena formación que tiende a ser la mitad del problema. También es bastante probable que se explote, ya que no es el mejor de su clase y tiene una gran huella de instalación grande para atacar a los piratas informáticos.

Creo que la sanitización mejor y más progresista es la html5lib porque está escrita para analizar como lo hace un navegador, y es una colaboración de muchos líderes en el campo. Sin embargo, es un poco lento y no muy parecido a Ruby.

En Ruby I recomiendan ya sea Loofah que levanta algo de la materia html5 sanitización pie de la letra, pero utiliza Nokogiri y corre mucho más rápido o Sanitize que tiene un conjunto de pruebas sólida y muy buena capacidad de configuración (no disparar en el pie, aunque)

Acabo de lanzar un complemento llamado ActsAsSanitiled que es una reescritura de ActsAsTextiled para desinfectar automágicamente la salida textilizada utilizando la gema Sanitize. Está diseñado para brindarle lo mejor de ambos mundos: la entrada no se tocó en la BD, sin embargo, el campo siempre genera HTML seguro sin necesidad de recordar nada en la plantilla. No utilizo Markdown, pero consideraría agregar compatibilidad con BlueCloth.

+0

Gracias. Si terminas soportando Markdown, RDiscount es mucho mejor que BlueCloth (más rápido, tiene soporte "Smarty") –