La pregunta de seguridad: cómo asegurar colecciones de Hibernate regresando desde el cliente al servidor?

StackOverflow https://stackoverflow.com/questions/2161149

Pregunta

Tengo un POJO simple denominada "Padres", que contiene una colección de objetos "Niño".

En Hibernate / JPA, es simplemente una relación uno-a-muchos, los niños no conocen a sus padres: estos objetos secundarios pueden tener diferentes tipos de Padres de modo que sea más fácil para no saber que el padre (piensan del Niño que representa Etiquetas y los padres pueden ser diferentes tipos de objetos que tienen etiquetas).

Ahora, yo envío mi objeto de Padres a la vista de cliente de mi sitio web para permitir que el usuario modifique.

Para ello, utilizo Hibernate / GWT / Gilead.

Mi usuario MADES algunos cambios y haga clic en el botón Guardar (Ajax), que envía a mi objeto de Padres al servidor. campos de mi padre ha sido modificado pero lo más importante, algunos objetos secundarios se ha añadido o eliminado de la colección.

Para resumen, cuando el objeto de Padres regresa al servidor, que ahora tiene en su colección: - El nuevo "niño" objetos donde id es nula y sin necesidad de ser persistir - modificado objetos "niño" donde id no es nulo y sin necesidad de ser de combinación - potencialmente hackeado "Niño" objetos donde id no es nulo, pero no son de propiedad originalmente por el Padre - Niño pérdida de objetos (suprimido): necesidad de ser suprimido

¿cómo se guarda el objeto padre (y su colección)? Cómo se carga la colección primaria de la base de datos para comparar cada uno de los objetos de la colección modificada para ver si no hay ningún elemento cortado? Cómo se borra la antigua colección (para quitar huérfano) y volver añadir nuevo hijo (pero hay algún niño que no ha sido modificada)?

gracias

PD: lo siento por mi Inglés, espero que tengan entender el concepto;)

¿Fue útil?

Solución 2

La mejor solución que he encontrado es la gestión de un DTO, creada manualmente. El DTO sólo envía necesario datas más al cliente. Para cada uno de los campos que desea establecer en el modo de sólo lectura, calculo una firma basada en una clave secreta que yo envío a mi cliente con dto.

Cuando mi DTO regresa al servidor, puedo comprobar la firma para asegurarse de que mi lectura únicos campos no han cambiado (recalcular la firma con los campos próximos espalda y compararla con la firma volviendo con dto)

Me permite especificar campos de sólo lectura y estar seguro de que mis objetos no son atacados.

Otros consejos

Algo en su pila tiene que suministrar la lógica que está hablando, y teniendo en cuenta sus circunstancias, es probable que usted. Usted tendrá que obtener el estado PERSISTED actual del objeto mediante la lectura de su fuente de datos para que pueda hacer la comparación. Tenga en cuenta que, si varias acciones legítimas pueden actualizar su objeto padre y su colección al mismo tiempo que tendrá que tener mucho cuidado sobre la definición de su grano de transacción y la naturaleza flujos seguros de su código.

Esto no es un problema sencillo por cualquier medio y bien puede haber características estructurales que pueden ayudar, pero estoy aún a encontrar algo que se ha resuelto este para cualquier aplicación en el mundo real que he encontrado, sobre todo cuando tengo lógica que intentó distinguir entre legítimo y "cortado" de datos.

Se puede considerar la alteración de la arquitectura de tal manera que los padres y los niños se conservan en acciones separadas. Puede que no sea apropiado en su caso, pero es posible que pueda tener un grano más fino de la transacción mediante la división de las acciones de persistencia y proporcionar seguridad orientado a los niños lo que hace que el problema de la piratería un poco más manejable.

Buena suerte. Te recomiendo que dibuja un diagrama de flujo detallado de la lógica antes de hacer demasiado codificación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top