tag img attribute html ruby-on-rails escaping textile

img - ¿Cómo puedo tejer y desinfectar html?



title html css (3)

Parece que el textil simplemente no admite lo que quieres.

Realmente desea permitir solo un subconjunto cuidadosamente controlado de HTML, 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" (definiendo eso, sin embargo, podría ser complicado). No sé si eso existe, sin embargo.

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

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.

  • html_escape(textilize("</body>Foo")) rompería textiles mientras

  • textilize(html_escape("</body>Foo")) funcionaría, pero rompe varias características textiles como enlaces (escritos como "Linkname":http://www.wheretogo.com/ ), ya que las comillas se transformarían en &quot; y por lo tanto no detectado por textiles nunca más.

  • sanitize no hace un mejor trabajo.

Alguna sugerencia sobre eso? Preferiría no usar Tidy para este problema. Gracias por adelantado.


Para aquellos que se encuentran con el mismo problema: si está usando la gema RedCloth , 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:

Acceso para establecer restricciones de seguridad.

Esto es algo bueno si está usando 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 se filter_html HTML que no fue creado por el procesador Textil. Alternativamente, si se establece sanitize_html , HTML puede pasar a través del procesador Textil pero las etiquetas y atributos no autorizados serán eliminados.


Esto funciona para mí y protege contra cada ataque XSS que he intentado, incluidos los controladores onmouse ... en los bloques de código y prebloqueo:

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

El desinfectante inicial elimina una gran cantidad de exploits XSS potenciales, incluidos los mouseover.

Por lo que puedo decir: filter_html escapa a la mayoría de las etiquetas html, aparte de 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 eliminó por completo la etiqueta del cuerpo deshonesto

Estoy usando Redcloth versión 4.2.3 y Rails versión 2.3.5