working rails not html_safe ruby-on-rails xss

ruby-on-rails - not - .html_safe rails



Escapar de HTML en Rails (5)

Acabo de lanzar un plugin llamado ActsAsSanitiled usa la gema Sanitize que puede garantizar una buena formación y que es muy configurable para el tipo de HTML permitido, todo sin mulgar las entradas del usuario o que requiera que se recuerde algo a nivel de plantilla.

¿Cuál es la forma recomendada de escapar de HTML para evitar las vulnerabilidades de XSS en las aplicaciones de Rails?

¿Debería permitir que el usuario coloque texto en la base de datos pero se escape de él cuando lo muestre? ¿Debe agregar los filtros before_save para escapar de la entrada?


Hay tres enfoques básicos para este problema.

  1. usa h() en tus vistas. La desventaja aquí es que si te olvidas, te pwnd.
  2. Utilice un complemento que se escapa del contenido cuando se guarda. Mi plugin xss_terminate hace esto. Entonces no tienes que usar h() en tus vistas (en su mayoría). Hay otros que trabajan en el nivel de controlador. Las desventajas aquí son (a) si hay un error en el código de escape, podría obtener XSS en su base de datos; y (b) hay casos de esquina en los que aún querrá usar h() .
  3. Utilice un complemento que se escapa del contenido cuando se muestra. CrossSiteSniper es probablemente el más conocido de estos. Esto alias tus atributos para que cuando llames foo.name escapa el contenido. Hay una forma de evitarlo si necesita que el contenido no se escape. Me gusta este complemento, pero en primer lugar no me gusta dejar que XSS ingrese a mi base de datos ...

Luego hay algunos enfoques híbridos.

No hay ninguna razón por la que no pueda usar xss_terminate y CrossSiteSniper al mismo tiempo.

También hay una implementación ERb llamada Erubis que se puede configurar para que se escape cualquier llamada como <%= foo.name %> , el equivalente de <%= h(foo.name) %> . Desafortunadamente, Erubis siempre parece estar rezagado con respecto a Rails, por lo que su uso puede ralentizarlo.

Si desea leer más, escribí una publicación de blog (a la que Xavor amablemente ha vinculado) sobre el uso de xss_terminate .


La h es un alias para html_escape , que es un método de utilidad para escapar de todos los caracteres de etiquetas HTML:

html_escape(''<script src=http://ha.ckers.org/xss.js></script>'') # => &lt;script src=http://ha.ckers.org/xss.js&gt;&lt;/script&gt;

Si necesita más control, utilice el método de sanitize , que se puede usar como una lista blanca de etiquetas y atributos para permitir:

sanitize(@article.body, :tags => %w(table tr td), :attributes => %w(id class style))

Permitiría al usuario ingresar cualquier cosa, almacenarla como está en la base de datos y escapar al mostrarla. De esa forma no perderá ninguna información ingresada. Siempre puedes modificar la lógica de escape más tarde ...



Usa el método h en tu plantilla de vista. Digamos que tienes un objeto post con una propiedad de comentario:

<div class="comment"> <%= h post.comment %> </div>