variable rails hacer como authenticity ruby-on-rails csrf

ruby on rails - hacer - Rails: ¿Cómo funciona csrf_meta_tag?



rails session (5)

Soy un desarrollador de PHP aprendiendo Ruby on Rails leyendo el tutorial de Michael Hartl . Aquí hay una cita del libro, refiriéndose a csrf_meta_tag :

... el método Rails csrf_meta_tag [impide] la falsificación de solicitudes entre sitios (CSRF), un tipo de ataque web malicioso. No te preocupes por los detalles (yo no); solo sepa que Rails está trabajando duro para mantener su aplicación segura.

El caso es que soy genuinamente curioso. ¿De qué manera la inserción de las csrf-param y csrf-token previene el CSRF? Probé Google, pero no pude encontrar nada.


El csrf_meta_tag inserta lo que esencialmente es una firma digital en la página, actuando como una verificación de que las solicitudes que ingresan al servidor de aplicaciones son, de hecho, de usuarios que han iniciado sesión correctamente. Esto ayuda a evitar secuencias de comandos entre sitios (una secuencia de comandos en una página no relacionada dispara solicitudes para decir, GMail, mientras está conectado a su cuenta GMail en otra pestaña).

Creo que para aclarar, el csrf_meta_tag sí mismo no impide que una página no relacionada csrf_meta_tag solicitudes a su GMail (o cualquier otro servicio que sea el objetivo del ataque), pero la "firma digital" en el csrf_meta_tag se usa para verificar la validez de dichas solicitudes. Las solicitudes no válidas (es decir, a partir de los intentos de creación de scripts entre sitios) deben fallar la validación y, por lo tanto, se descartan.

Para decirlo de otra manera, desde el punto de vista del atacante:

Antes de que existieran csrf_meta_tags (no son exclusivos de Rails de ningún modo), los ataques de scripts cruzados exitosos permitían que un sitio malicioso enviara datos a una aplicación web de forma tal que la solicitud apareciera como si se estuviera haciendo en nombre del usuario. . Entonces, digamos que usted es un administrador en un servicio web, y en una pestaña del navegador está conectado al panel de administración para ese servicio. Si un sitio malicioso se abre en otra pestaña apuntó a su servicio para un ataque, el sitio malicioso podría ejecutar scripts que realizan solicitudes de administrador, como eliminar la lista de usuarios de la base de datos, robar otros datos confidenciales o dañar potencialmente, dañar, o destruyendo datos contenidos en el servicio, todo mientras aparece (desde el punto de vista del servidor) para que sean solicitudes válidas del propio administrador. El csrf_meta_tag es una forma de firmar solicitudes y ayudar a evitar que dichos intentos csrf_meta_tag éxito.

Hay una explicación mucho más detallada disponible aquí .

También sería educativo hacer una "fuente de vista" en una de sus páginas generadas por Rails, y verá cómo se ve la etiqueta CSRF.


En Rails funcionará de esta manera

def csrf_meta_tags if protect_against_forgery? [ tag(''meta'', :name => ''csrf-param'', :content => request_forgery_protection_token), tag(''meta'', :name => ''csrf-token'', :content => form_authenticity_token) ].join("/n").html_safe end end

Ver más detalles simplemente haga clic

También debe consultar la Guía de seguridad de Ruby On Rails

aquí está el buen blog

PERO - Prefiero la Base de Datos Nacional de Vulnerabilidad, aquí está la buena explicación

CWE-352: Falsificación de solicitudes entre sitios (CSRF)

CWE-79: Neutralización inadecuada de entrada durante la generación de páginas web (''Cross-site Scripting'')

Consulte este documento para CWE - Enumeración de debilidad común


Salida del helper csrf_meta_tags :

<meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="J/gw2ePXHS9Z1SUSSeUQgMmPhsPEFlFbMrLTLFHLfKjeWh7g4uyOnBlfKnlZlmCBiALDWdDWCSo1z0tybGVtfA==" />

Este token se puede incluir en la solicitud ajax. Exapmle ( jquery-ujs ):

https://github.com/rails/jquery-ujs/blob/4b6e30f68ff1244fc0c790641d3408c2695a29bd/src/rails.js#L70

csrfToken: function() { return $(''meta[name=csrf-token]'').attr(''content''); }, // URL param that must contain the CSRF token csrfParam: function() { return $(''meta[name=csrf-param]'').attr(''content''); }, // Make sure that every Ajax request sends the CSRF token CSRFProtection: function(xhr) { var token = rails.csrfToken(); if (token) xhr.setRequestHeader(''X-CSRF-Token'', token); },


csrf_meta_tag básicamente cumple lo mismo que los campos de formulario ocultos, pero está ahí para dar a las solicitudes de javascript que no están vinculadas a un formulario una manera fácil de obtener el token.

Si utiliza la biblioteca jquery-ujs , el contenido de esa metaetiqueta se agrega automáticamente (como un encabezado de solicitud) a cualquier solicitud ajax realizada.


csrf_meta_tags son indicaciones para que las solicitudes ajax utilicen estos como uno de los parámetros de formulario para realizar una solicitud al servidor. Rails espera que el csrf forme parte de su cuerpo de formulario (params) para procesar sus solicitudes. Con estas metaetiquetas, puede construir el cuerpo del formulario o el encabezado csrf para adaptarlo a sus necesidades. Espero que esta respuesta ayude a tu pregunta.