php - the - csrf token c#
¿Es suficiente una comprobación del servidor de cabecera X-Requested-With para proteger contra un CSRF para una aplicación controlada por ajax? (6)
Lo que está haciendo es seguro porque xmlhttprequest normalmente no es vulnerable a la falsificación de solicitudes entre sitios.
Como este es un problema del lado del cliente, la forma más segura sería verificar la arquitectura de seguridad de cada navegador :-)
(Este es un resumen; estoy agregando esta respuesta porque esta pregunta es muy confusa, veamos lo que dicen los votos)
Estoy trabajando en una aplicación completamente manejada por ajax en la que todas las solicitudes pasan a través de lo que básicamente equivale a un controlador principal que, en esencia, se parece a esto:
if(strtolower($_SERVER[''HTTP_X_REQUESTED_WITH'']) == ''xmlhttprequest'') {
fetch($page);
}
¿Es esto generalmente suficiente para proteger contra las falsificaciones de solicitudes entre sitios?
Es bastante inconveniente tener un token rotativo cuando no se actualiza la página completa con cada solicitud.
Supongo que podría pasar y actualizar el token único como una variable javascript global con cada solicitud, pero de alguna manera eso me parece torpe y de todas formas parece inseguro.
EDITAR - ¿Quizás un token estático, como el UUID del usuario, sería mejor que nada?
EDITAR # 2 - Como lo señaló The Rook , esta podría ser una pregunta desgarradora. He leído especulaciones en ambos sentidos y he escuchado susurros lejanos sobre versiones antiguas de flash que son explotables para este tipo de travesuras. Como no sé nada al respecto, estoy ofreciendo una recompensa a cualquiera que pueda explicar cómo se trata de un riesgo CSRF. De lo contrario, se lo doy a Artefacto . Gracias.
No creo que esto ofrezca ningún tipo de protección. Un sitio atacante aún podría usar xmlhttprequest
para que su solicitud entre sitios xmlhttprequest
su cheque.
No creo que esto sea seguro. Las mismas políticas de origen están diseñadas para evitar que los documentos de diferentes dominios accedan al contenido que se devuelve desde un dominio diferente. Esta es la razón por la cual los problemas XSRF existen en primer lugar. En general, a XSRF no le importa la respuesta. Se utiliza para ejecutar un tipo específico de solicitud, como una acción de eliminación. En la forma más simple, esto se puede hacer con una etiqueta img correctamente formateada. Su solución propuesta evitaría esta forma más simple, pero no protege a alguien del uso del objeto XMLHttp para realizar la solicitud. Necesita utilizar las técnicas de prevención estándar para XSRF. Me gusta generar un número aleatorio en javascript y agregarlo a la cookie y una variable de formulario. Esto asegura que el código también pueda escribir cookies para ese dominio. Si desea más información por favor vea esta entrada .
Además, para anticiparse a los comentarios sobre XMLHttp no funciona en el script. Utilicé el siguiente código con Firefox 3.5 para realizar una solicitud a Google desde html que se ejecuta en el dominio localhost. El contenido no se devolverá, pero al usar Firebug, puede ver que se realizó la solicitud.
<script>
var xmlhttp = false;
if (!xmlhttp && typeof XMLHttpRequest != ''undefined'') {
try {
xmlhttp = new XMLHttpRequest();
} catch (e) {
xmlhttp = false;
}
}
if (!xmlhttp && window.createRequest) {
try {
xmlhttp = window.createRequest();
} catch (e) {
xmlhttp = false;
}
}
xmlhttp.open("GET", "http://www.google.com", true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
alert("Got Response");
alert(xmlhttp.responseText)
}
}
xmlhttp.send(null)
alert("test Complete");
Respuesta corta: no. Cualquier atacante solo usaría Ajax para atacar tu sitio web. Debería generar un token aleatorio con una duración corta pero no demasiado prolongada que actualizaría durante cada solicitud de ajax.
Tendría que usar una matriz de tokens en javascript, ya que puede tener varias solicitudes ajax ejecutándose al mismo tiempo.
Sí. Es un enfoque reconocido para la protección CSRF.
Yo diría que es suficiente. Si se permitieran las solicitudes de dominios cruzados, estaría condenado de todos modos porque el atacante podría usar Javascript para obtener el token CSRF y usarlo en la solicitud falsificada.
Un token estático no es una gran idea. El token se debe generar al menos una vez por sesión.
EDIT2 Mike no está bien después de todo, lo siento. No había leído la página a la que he enlazado correctamente. Dice:
Una solicitud simple entre sitios es una: [...] No establece encabezados personalizados con la solicitud HTTP (como X-Modified, etc.)
Por lo tanto, si configura X-Requested-With
, la solicitud debe ser predefinida y, a menos que responda a la solicitud de OPTIONS
previa al vuelo que autoriza la solicitud entre sitios, no se realizará.
EDITAR Mike tiene razón, a partir de Firefox 3.5, se permitted solicitudes XMLHttpRe sitio. En consecuencia, también debe verificar si el encabezado de Origin
, cuando existe, coincide con su sitio.
if (array_key_exists(''HTTP_ORIGIN'', $_SERVER)) {
if (preg_match(''#^https?://myserver.com$#'', $_SERVER[''HTTP_ORIGIN''])
doStuff();
}
elseif (array_key_exists(''HTTP_X_REQUESTED_WITH'', $_SERVER) &&
(strtolower($_SERVER[''HTTP_X_REQUESTED_WITH'']) == ''xmlhttprequest''))
doStuff();