enlace dice:
El cliente DEBE implementar la protección CSRF [...] que normalmente se realiza al requerir que cualquier solicitud enviada al punto final de URI de redirección incluya un valor que vincule la solicitud al estado autenticado del agente de usuario (por ejemplo, un hash de la cookie de sesión [ ...]
Sin embargo, no dice mucho sobre la implementación. Solo aclara cómo funciona el CSRF:
Un ataque CSRF contra el URI de redirección del cliente permite a un atacante inyectar su propio código de autorización o token de acceso, lo que puede hacer que el cliente use un token de acceso asociado con los recursos protegidos del atacante en lugar del de la víctima (por ejemplo, guardar el banco de la víctima información de la cuenta a un recurso protegido controlado por el atacante)
Pero el uso de la palabra "más bien" hace que la declaración no valga nada.
Estoy pensando en cómo implementar el "estado" en GAE (usando Webapp2). Sería más fácil comenzar por cómo un pirata informático podría usar un CSRF contra OAuth2. Encontré solo un buen artículo sobre el asunto: "Falsa de solicitud de sitios cruzados y OAuth2 ".
Lamentablemente, aunque esta publicación de blog está bien escrita, no hay mucha información más allá de explicar OAuth2. Los ejemplos no funcionan, y no sé Spring. Aún así, encontré una recomendación interesante: el servidor que se conecta a un proveedor OAuth2 debería almacenar "estado" como una clave de sesión aleatoria (por ejemplo, "this_is_the_random_state": "this_doesn't_matter") , y no es un valor bajo una clave estática (por ejemplo, "estado": "random_state_string").
Mi pregunta es, ¿cuál es la implementación sensata del "estado"?
- ¿Se debe marcar el estado generado aleatoriamente, o se puede almacenar el mismo valor y enviarlo al proveedor de OAuth2?
- ¿Hay alguna diferencia aquí si el backend de la sesión es cookies seguras o una tecnología de almacenamiento del lado del servidor (por ejemplo, en GAE Memcache o base de datos)?
- ¿Se debe almacenar el estado como una clave como se sugiere?
- ¿Debería el estado tener un período de validez o la sesión (si hay una) es suficiente para toda la vida?