Domanda

Sto lavorando a un'applicazione web (J2EE) e vorrei conoscere le opzioni disponibili per la gestione di un doppio post dal browser.

Le soluzioni che ho visto e usato in passato sono tutte lato client:

  • Disabilita il pulsante di invio non appena l'utente lo fa clic.
  • Segui un modello POST-Redirect-GET per impedire i POST quando l'utente fa clic sul pulsante Indietro.
  • Gestisci l'evento onSubmit del modulo e tieni traccia dello stato di invio con JavaScript.

Preferirei implementare una soluzione lato server, se possibile. Esistono approcci migliori di quelli che ho menzionato sopra o le soluzioni lato client sono le migliori?

È stato utile?

Soluzione

È difficile implementare una soluzione a prova di idiota (poiché migliorano sempre gli idioti). Indipendentemente da ciò che fai, il lato client può essere manipolato o eseguito in modo errato.

La tua soluzione deve essere lato server per essere affidabile e sicura. Detto questo, un approccio è quello di rivedere la richiesta e controllare lo stato del sistema / database o i registri per determinare se è già stata elaborata. Idealmente, il processo sul lato server dovrebbe essere idempotente, se possibile , e dovrà proteggere da invii duplicati se non può esserlo.

Altri suggerimenti

Puoi fornire un "biglietto" come parte del modulo, un numero casuale - e assicurati che non venga accettato due volte, sul lato server.

Vengono in mente due soluzioni lato server:

  1. Crea un solo utilizzo " token " in un campo modulo nascosto. Una volta utilizzato, un token viene eliminato da qualsiasi oggetto di contesto di database o sessione in cui lo si memorizza. La seconda volta, non viene accettato.
  2. Informazioni sulla cache ricevute e se viene ricevuto un modulo identico entro un determinato periodo di tempo (10 minuti? un'ora? Decidi!), viene ignorato.

Implementa un uniqueid per andare con la richiesta e registralo insieme all'esecuzione. Se l'id è già stato registrato, non eseguire più il lavoro. Questo è un po 'come la soluzione di fallback: dovresti provare a disabilitare il pulsante o collegare il lato client così come hai suggerito te stesso

utilizziamo un ticket temporizzato, una tantum. È come un ID di sessione di sorta. Ma è legato al modulo / pagina.

Scarti il ??ticket quando l'utente invia la pagina e elabori solo le pagine fornite con un ticket valido. Puoi, allo stesso tempo, rafforzare la sicurezza allegando il ticket a un utente, quindi tat se arriva un ticket che viene inviato da un utente che non è l'utente a cui è stato inviato il ticket, rifiuti la richiesta.

Vorrei utilizzare un timestamp e confrontare i valori con il codice lato server. Se due timestamp sono abbastanza vicini e hanno lo stesso indirizzo IP, ignorare l'invio del secondo modulo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top