2009-09-29 10 views
5

Me preguntaba, y hasta el momento no he podido encontrar ninguna respuesta en línea, cómo lograr lo siguiente.Rieles: escapando de HTML usando h() Y excluyendo etiquetas específicas

Digamos que tengo una cadena que contiene lo siguiente:

mi_cadena = "Hola , soy una cadena." (en la ventana de vista previa veo que esto está formateando en negrita y en italiano en lugar de mostrar las etiquetas "fuerte" e "i")

Ahora, me gustaría hacer esto seguro, usando html_escape() (o h()) método/función. Así que me gustaría evitar que los usuarios inserten javascript y/o hojas de estilo, sin embargo, sí quiero que la palabra "Hola" aparezca en negrita y la palabra "cadena" se muestre en cursiva.

Por lo que puedo ver, el método h() no toma ningún argumento adicional, aparte del texto en sí.

¿Hay alguna manera de evitar solo ciertas etiquetas html, en lugar de todas? ¿Al igual que las etiquetas blancas o negras?

Ejemplo de lo que esto podría ser similar, de lo que estoy tratando de decir sería:

h (mi_cadena,: a excepción => [: fuertes,: i]) # => lo que, básicamente, la fuga todo, pero deje las etiquetas "fuerte" e "i" solo, no se escape de estas.

¿Hay algún método o forma de lograr esto?

¡Gracias de antemano!

Respuesta

3

Excluir etiquetas específicas es en realidad un problema bastante difícil. Especialmente la etiqueta script se puede insertar en very many different ways - detectarlos es muy complicado.

Si es posible, no implemente esto usted mismo.

2

¿Ha considerado utilizar RedCloth o BlueCloth en lugar de permitir HTML? Estos métodos proporcionan un buen número de opciones de formato y administran el análisis sintáctico para usted.

Edit 1: Encontré this message al buscar información acerca de cómo eliminar HTML utilizando RedCloth, podría ser de alguna utilidad. Además, this page muestra cómo la versión 2.0.5 le permite eliminar HTML. Parece que no se puede encontrar información más reciente, pero forum post encontró una vulnerabilidad. Esperemos que se haya corregido desde que fue desde 2006, pero parece que no puedo encontrar un manual o documentación de RedCloth ...

+0

RedCloth es genial, pero _no_ eliminará ninguna etiqueta html; Puedo insertar y no se escapará. No estoy seguro de cómo BlueCloth elimina HTML; No lo he usado antes – zgchurch

2

Utilice el complemento white list o una versión modified del mismo. ¡Es súper! También puede echar un vistazo Sanitize (Parece mejor, nunca lo intenté).

1

Me gustaría desinfectar para eliminar etiquetas HTML. Funciona realmente bien. Elimina todo de forma predeterminada y puede especificar una lista blanca para las etiquetas que desea permitir.

0

La prevención de ataques XSS es un asunto serio, siga a hrnt's y considere que probablemente haya un orden de magnitud mayor de exploits que debido a caprichos oscuros del navegador.Aunque html_escape bloqueará bastante las cosas, creo que es un error usar algo interno para este tipo de cosas. Simplemente necesita más ojos y revisión por pares para cualquier tipo de garantía de solidez.

Estoy en el proceso de evaluar sanitize contra XssTerminate en este momento. Prefiero el enfoque xss_terminate por su robustez: el restregado a nivel de modelo será bastante confiable en una aplicación de Rails regular donde todas las entradas de los usuarios pasan por ActiveRecord, pero Nokogiri y específicamente Loofah parecen ser un poco más formativas, más activas y, definitivamente, más flexible y Ruby-ish.

actualización acabo implementó un tenedor de ActsAsTextiled llama ActsAsSanitiled que utiliza Santize (que recientemente se ha actualizado para utilizar nokogiri por cierto) para garantizar la seguridad y la buena formación de la salida RedCloth, todo ello sin necesidad de ningún ayudantes en sus plantillas

Cuestiones relacionadas