2008-09-24 10 views
15

Estoy trabajando en una aplicación web (J2EE) y me gustaría saber las opciones disponibles para manejar una doble publicación desde el navegador.Cómo evitar que un usuario publique datos varias veces en un sitio web

Las soluciones que he visto y utilizado en el pasado son todos del lado del cliente:

  • deshabilitar el botón de enviar tan pronto como el usuario hace clic en él.
  • Siga un patrón POST-Redirect-GET para evitar POST cuando el usuario hace clic en el botón Atrás.
  • Gestione el evento onSubmit del formulario y realice un seguimiento del estado de envío con JavaScript.

Preferiría implementar una solución del lado del servidor si es posible. ¿Hay mejores enfoques que los que mencioné anteriormente, o son mejores las soluciones del lado del cliente?

Respuesta

8

Es difícil implementar una solución a prueba de idiotas (ya que siempre mejoran los idiotas). No importa lo que haga, el lado del cliente puede manipularse o funcionar incorrectamente.

Su solución tiene que ser del lado del servidor para ser confiable y segura. Dicho esto, un enfoque es revisar la solicitud y verificar el estado o los registros del sistema/base de datos para determinar si ya se procesó. Idealmente, el proceso en el lado del servidor debe ser idempotente si es posible, y tendrá que proteger contra los envíos dupe si no puede ser.

8

Puede proporcionar un "boleto" como parte del formulario, un número aleatorio y asegúrese de que no se acepte dos veces, en el lado del servidor.

+0

¿cómo manejar un usuario pulsa el botón de retroceso (la mayoría de los navegadores no re-petición), el cambio de los datos en la forma y presentación de la misma "billete" de nuevo? – JeremyWeir

+4

No puede evitar que el usuario vuelva a enviar una nueva solicitud con el mismo ticket, pero puede rechazarla en el servidor, con un error de "Solicitud duplicada". – zigdon

+0

Correcto, pero las personas lo hacen a propósito: envíe un formulario, presione atrás porque saben que necesitan corregir algo, envíe el formulario nuevamente. Su uso legítimo del botón Atrás del navegador para editar un registro generaría un error. – JeremyWeir

3

Dos soluciones de servidor vienen a la mente:

  1. Crear utiliza las "fichas" de una sola vez en un campo de formulario oculto. Una vez que se utiliza un token, se elimina de cualquier base de datos o objeto de contexto de sesión en el que lo esté almacenando. La segunda vez, no se acepta.
  2. La información de caché recibida, y si se recibe un formulario idéntico dentro de un cierto período de tiempo (10 minutos? ¿Una hora? ¡Usted decide!) Se ignora.
+0

1. ¿Cómo maneja a un usuario presionando el botón Atrás (la mayoría de los navegadores no vuelven a solicitar), cambiando los datos en el formulario y enviando el mismo token nuevamente? 2. ¿Qué pasa si dentro del período de tiempo el formulario se envía con un valor A, luego el usuario lo cambia para tener el valor B, luego lo cambia de nuevo al valor A? ¿No ignoraría eso el último cambio? – JeremyWeir

2

Implemente un uniqueid para ir con la solicitud y registrarla junto con la ejecución. Si la identificación ya estaba registrada, no volverás a hacer el trabajo. Esto es un poco como la solución alternativa: debe intentar y deshabilitar el botón o enlace al lado del cliente, así como usted sugirió

-2

Usaría una marca de tiempo y compararía los valores con el código del lado del servidor. Si dos marcas de tiempo están lo suficientemente cerca y tienen la misma dirección IP, ignore el segundo envío del formulario.

+0

op solicitó una solución del lado del servidor – paan

+0

No leí la publicación con cuidado, pero edité mi respuesta para que esté más en línea con la pregunta. – VirtuosiMedia

+0

¿Y si el usuario realmente tiene dos bits de datos que desean publicar en ese período de tiempo? La mala suerte parece ser tu respuesta. – roryf

2

utilizamos un boleto de tiempo único. Es como una identificación de sesión de tipo. Pero está vinculado a la forma/página.

Descarte el ticket cuando el usuario envía la página, y solo procesa las páginas que vienen con un ticket válido. Puede, al mismo tiempo, reforzar la seguridad al adjuntar el ticket a un usuario, por lo que si envía un ticket que es enviado por un usuario que no es el usuario al que se envió el ticket, rechaza la solicitud.

Cuestiones relacionadas