Pregunta

Estoy trabajando en una aplicación web (J2EE) y me gustaría conocer las opciones disponibles para gestionar una doble publicación desde el navegador.

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

  • Deshabilite el botón de envío tan pronto como el usuario lo haga clic.
  • Siga un patrón POST-Redirect-GET para evitar las POST cuando el usuario haga clic en el botón Atrás.
  • Maneje el evento onSubmit del formulario y realice un seguimiento del estado del envío con JavaScript.

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

¿Fue útil?

Solución

Es difícil implementar una solución a prueba de idiotas (ya que siempre están mejorando a los idiotas). No importa lo que haga, el lado del cliente se puede manipular o realizar incorrectamente.

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

Otros consejos

Podría proporcionar un " ticket " como parte del formulario, algún número aleatorio, y asegúrese de que no se acepte dos veces, en el lado del servidor.

Se me ocurren dos soluciones del lado del servidor:

  1. Crear un solo uso " tokens " en un campo de formulario oculto. Una vez que se usa un token, se elimina de la base de datos o del objeto de contexto de sesión en el que se está almacenando. La segunda vez, no se acepta.
  2. La información del caché recibida, y si se recibe un formulario idéntico dentro de un período de tiempo determinado (¿10 minutos? ¡Una hora? ¡Usted decide!), se ignora.

Implemente un identificador único para ir con la solicitud y regístrelo junto con la ejecución. Si la identificación ya estaba registrada, no volverá a hacer el trabajo. Esto es un poco como la solución alternativa: debe intentar y desactivar el botón o el enlace del lado del cliente, así como usted mismo sugirió

usamos un boleto de una vez, sensible al tiempo. Es como una identificación de sesión de tipo. Pero está ligado al formulario / página.

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

Usaría una marca de tiempo y compararía 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 envío del segundo formulario.

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