2010-06-06 11 views
14

¿Puedo usar ActionView::Helpers::SanitizeHelper#sanitize en el texto ingresado por el usuario que planeo mostrar a otros usuarios? Por ejemplo, ¿manejará correctamente all cases described on this site?¿Qué tan bueno es el método Rails sanitize()?

Además, la documentación menciona:

Tenga en cuenta que la desinfección texto proporcionado por el usuario no garantiza que el margen de beneficio resultante es válida (ajuste a un tipo de documento) o incluso bien formada. La salida aún puede contener, p. sin guardado '<', '>', '&' caracteres y confunden los navegadores.

¿Cuál es la mejor manera de manejar esto? ¿Pasa el texto sanitizado a través del Hpricot antes de mostrar?

Respuesta

4

El mejor curso de acción depende de dos cosas:

  • Su versión 2.x o carriles (3.x)
  • Ya sea que sus usuarios se supone que deben entrar en cualquier html en absoluto en el entrada o no

Como regla general, no permito que mis usuarios ingresen html, sino que les dejo ingresar texto.

En los carriles 3.x:

La entrada del usuario es verificada por defecto. No tiene que hacer nada, a menos que desee que sus usuarios puedan enviar algunos html. En ese caso, sigue leyendo.

This railscast trata de ataques XSS en los carriles 3.

sobre raíles 2.x:

Si usted no permite que todo el código HTML de sus usuarios, simplemente proteger su salida con el método h, de esta manera:

<%= h post.text %> 

Si desea que sus usuarios enviar algo de hTML: se puede usar sanitize método rieles o HTML::StathamSanitizer

+0

Eso realmente no responde a la pregunta .. – Lichtamberg

+0

@Lichtamberg: ¿Por qué no? – kikito

+0

no directamente, pero es una buena información para un amigo (yo) al azar para comprender mejor el problema – brittohalloran

11

Sanitizar es sin duda mejor que el "h" ayudante. En lugar de escapar de todo, en realidad permite las etiquetas html que especifique. Y sí, previene las secuencias de comandos de sitios cruzados porque elimina completamente javascript de la mezcla.

En resumen, ambos harán el trabajo. Use "h" cuando no espere nada más que texto sin formato, y use desinfectar cuando quiera permitir algunos, o si cree que las personas pueden tratar de ingresarlo. Incluso si deshabilita todas las etiquetas con sanitize, "redondeará" el código eliminándolas en lugar de escapar de ellas como lo hace "h".

En cuanto a las etiquetas incompletas: Puede ejecutar una validación en el modelo que pasa campos que contienen html a través de hpricot, pero creo que esto es excesivo en la mayoría de las aplicaciones.

+2

Todos deben tener en cuenta que Rails 4 se está mudando a la gema Loofah para su desinfección, que puede usarse independientemente en los rieles 3, y hasta ahora parece muy buena. – MBHNYC

15

Ryan Grove Sanitize va mucho más lejos que Rails 3 sanitize. Se asegura la salida está bien formado en HTML y tiene tres incorporados en las listas blancas:

Desinfección :: Config :: RESTRINGIDO permite sólo en línea muy simple formateo marcado. Sin enlaces, imágenes o elementos de bloque.

Sanitize :: Config :: BASIC Permite una variedad de marcado incluyendo etiquetas de formato, enlaces y listas. Las imágenes y las tablas no están permitidas, los enlaces están limitados a los protocolos FTP, HTTP, HTTPS y mailto, y se agrega un atributo a todos los enlaces para mitigar el correo no deseado de SEO.

Desinfección :: Config :: RELAJADO Permite una mayor variedad de marcas que lo básico, incluyendo imágenes y tablas. Los enlaces siguen estando limitados a los protocolos FTP, HTTP, HTTPS y mailto, mientras que las imágenes están limitadas a HTTP y HTTPS. En este modo, no se agrega a los enlaces.

+2

Aquí hay un artículo reciente que habla de Sanitize vs the Rails 3 'sanitize' de Ryan Grove: http://devblog.supportbee.com/2011/08/15/sanitizing-css-in-rails/ – Purplejacket

Cuestiones relacionadas