Entonces, ¿cuál es la mejor manera de prevenir un ataque XSRF para una aplicación GAE? Imagine lo siguiente:¿Cómo prevenir mejor los ataques de CSRF en una aplicación GAE?
- Cualquiera puede ver el objeto público de un usuario, y el id. De db.Model se utiliza en la solicitud para determinar qué objeto mostrar. El usuario malintencionado ahora tiene la identificación.
- El usuario malintencionado crea su propio objeto y comprueba el formulario de eliminación. Ahora saben cómo eliminar un objeto con una determinada identificación.
- El usuario malintencionado consigue que un usuario inocente envíe una solicitud de eliminación para el objeto de ese usuario.
¿Qué pasos puedo agregar para evitar el # 3? Tenga en cuenta que cuando digo ID, estoy usando la parte de ID real de la clave. Una idea que tuve fue usar el valor de la clave completa en las solicitudes de eliminación, pero ¿evitaría que un usuario malintencionado pueda resolver esto? Hasta donde yo sé, la clave es una combinación del tipo de clase de modelo, el id de la aplicación y el ID de la instancia del objeto, por lo que probablemente podrían derivar la clave del ID si así lo desean.
¿Alguna otra idea? Jeff escribió a post about this, y sugirió un par de métodos: un valor de formulario oculto que cambiaría en cada solicitud y un valor de cookie escrito mediante js en el formulario. No querré excluir usuarios que no sean javascript, por lo que la solución de cookies no sirve; para el valor de formulario oculto, tendría que hacer una escritura en el almacén de datos en cada solicitud que mostrara un objeto eliminable, no una situación ideal para una escalabilidad aplicación!
¿Alguna otra idea por ahí?
También me gusta el enfoque de Macbirdie, pero me gusta que esto proporcione una seguridad razonable sin almacenamiento en el lado del servidor. –