2009-02-01 13 views
5

Ahora me encontré con una situación estúpida. Quiero que los usuarios puedan usar textiles, pero no deberían perder el tiempo con mi HTML válido alrededor de su entrada. Así que tengo que escapar del HTML de alguna manera.¿Cómo debo tejer y desinfectar html?

  • html_escape(textilize("</body>Foo")) rompería textil, mientras que

  • textilize(html_escape("</body>Foo")) quiere trabajar, pero se rompe varias características textiles como enlaces (escrito como "Linkname":http://www.wheretogo.com/), ya que las cotizaciones se transformarían en &quot; y por lo tanto no se detectan mediante textil más.

  • sanitize no hace un mejor trabajo.

¿Alguna sugerencia a eso? Preferiría no utilizar Tidy para este problema. Gracias de antemano.

Respuesta

7

Para aquellos que se encuentran con el mismo problema: Si está usando RedCloth gema, puede definir su propio método (en uno de sus ayudantes).

 
def safe_textilize(s) 
    if s && s.respond_to?(:to_s) 
    doc = RedCloth.new(s.to_s) 
    doc.filter_html = true 
    doc.to_html 
    end 
end 

Extracto de la documentación:

descriptores de acceso para configurar las restricciones de seguridad.

Esto es algo bueno si usa RedCloth para formatear en lugares públicos (por ejemplo, Wikis) donde no desea que los usuarios abusen de HTML por cosas malas.

Si se establece filter_html, HTML que no fue creado por el procesador Textil será escapado. Alternativamente, si se establece sanitize_html, HTML puede pasar por el procesador Textil , pero se eliminarán las etiquetas y los atributos no autorizados.

+1

Pero ten cuidado con los exploits de etiquetas pre y código. p.ej. (¿me atrevo a arriesgar esto?)

!!!!mouse trap!!!!

0

Parece que el textil simplemente no admite lo que usted desea.

Realmente desea permitir solo un subconjunto de HTML cuidadosamente controlado, pero el material textil está diseñado para permitir HTML arbitrario. No creo que puedas usar textil en esta situación (a menos que sea compatible con ese tipo de restricción).

Lo que necesita es probablemente una versión especial "restringida" de textil, que solo permita el marcado "seguro" (lo que sin embargo puede ser complicado). No sé si eso existe, sin embargo.

Puede echar un vistazo a BBCode, que permite restringir el posible marcado.

+0

Hay también Markdown (que usa Stack Overflow), http://daringfireball.net/projects/markdown/ –

+0

Sí, también pensé en el descuento. Pero AFAIK stackoverflow escapa más (algunos blogpost de Jeff lo señalaron). Markdown también permite HTML arbitrario. –

+0

@David Zaslavsky: Lea del sitio web oficial (http://daringfireball.net/projects/markdown/syntax#overview): "Para cualquier marcado que no esté cubierto por la sintaxis de Markdown, simplemente use el HTML mismo". – Vanuan

2

Esto funciona para mí y protege contra todos los ataques XSS He intentado incluyendo onmouse ... manipuladores en pre y códigos de bloques:

<%= RedCloth.new(sanitize(@comment.body), [:filter_html, :filter_styles, :filter_classes, :filter_ids]).to_html -%> 

El desinfectar inicial quita mucho potencial XSS explota incluidos mouseover.

Por lo que puedo decir: filter_html escapa a la mayoría de las etiquetas html además del código y pre.Los otros filtros están ahí porque no quiero que los usuarios apliquen clases, identificadores y estilos.

Acabo de probar mi página de comentarios con tu ejemplo

"</body>Foo" 

y eliminado completamente la etiqueta del cuerpo pícaro

estoy usando RedCloth versión 4.2.3 y la versión 2.3.5 Carriles

Cuestiones relacionadas