Comment empêcher un utilisateur de publier des données plusieurs fois sur un site Web

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

  •  02-07-2019
  •  | 
  •  

Question

Je travaille sur une application Web (J2EE) et j'aimerais connaître les options disponibles pour gérer un double message à partir du navigateur.

Les solutions que j'ai vues et utilisées par le passé sont toutes du côté client:

  • Désactivez le bouton d'envoi dès que l'utilisateur clique dessus.
  • Suivez un modèle POST-Redirect-GET pour empêcher les POST lorsque l'utilisateur clique sur le bouton Précédent.
  • Gérez l'événement onSubmit du formulaire et suivez l'état de soumission avec JavaScript.

Je préférerais implémenter une solution côté serveur si possible. Existe-t-il de meilleures approches que celles que j'ai mentionnées ci-dessus ou les solutions côté client sont-elles meilleures?

Était-ce utile?

La solution

Il est difficile de mettre en œuvre une solution anti-imbécile (car ils améliorent toujours les imbéciles). Quoi que vous fassiez, le côté client peut être manipulé ou mal exécuté.

Votre solution doit être côté serveur pour être fiable et sécurisée. Ceci dit, une approche consiste à examiner la demande et à vérifier l'état du système / de la base de données ou les journaux pour déterminer si elle a déjà été traitée. Idéalement, le processus côté serveur devrait être idempotent, si possible , et il devra se protéger contre les soumissions en cas de dupe s'il ne peut pas l'être.

Autres conseils

Vous pouvez fournir un "billet". dans le formulaire, un nombre aléatoire - et assurez-vous qu'il ne soit pas accepté deux fois, côté serveur.

Deux solutions côté serveur viennent à l’esprit:

  1. Créer une seule utilisation " jetons " dans un champ de formulaire caché. Une fois qu'un jeton est utilisé, il est supprimé de tout objet de la base de données ou du contexte de session dans lequel vous le stockez. La seconde fois, il n'est pas accepté.
  2. Les informations de cache reçues et si un formulaire identique est reçu dans un certain délai (10 minutes? une heure? Vous décidez!), il est ignoré.

Implémentez un uniqueid pour aller avec la demande et enregistrez-le avec l'exécution. Si l'identifiant était déjà connecté, vous ne refaireez pas le travail. Cela ressemble un peu à la solution de secours - vous devriez essayer de désactiver le bouton ou de lier le côté client ainsi que vous l'avez suggéré

nous utilisons un ticket ponctuel et sensible au temps. C'est comme un identifiant de session. Mais il est lié à la forme / page.

Vous supprimez le ticket lorsque l'utilisateur soumet la page et vous ne traitez que les pages fournies avec un ticket valide. En même temps, vous pouvez renforcer la sécurité en associant le ticket à un utilisateur. Ainsi, si un ticket arrive est soumis par un utilisateur autre que l'utilisateur auquel il a été soumis, vous refusez la demande.

Je voudrais utiliser un horodatage et comparer les valeurs avec votre code côté serveur. Si deux horodatages sont suffisamment proches et ont la même adresse IP, ignorez la deuxième soumission du formulaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top