Comment puis-je empêcher les gens de renvoyer intentionnellement un formulaire?

Je construis un site Web en utilisant Ubuntu, Apache et Django. Je voudrais empêcher les gens de remplir et de soumettre un formulaire particulier sur mon site plus d’une fois. Je sais qu’il est pratiquement impossible d’empêcher un utilisateur déterminé de modifier son adresse IP, de supprimer ses cookies, etc. tout ce que je recherche est quelque chose qui dissuade l’utilisateur occasionnel de se soumettre à nouveau.

Il me semble que bloquer plusieurs soumissions de formulaires à partir de la même adresse IP est le meilleur moyen de réaliser ce que je recherche. Cependant, je ne sais pas comment je devrais le faire, et si je devrais le faire à partir d’Apache ou de Django. Des conseils?

Edit: Je cherche à empêcher une nouvelle soumission intentionnelle, pas seulement une double soumission involontaire. Par exemple, j’ai une enquête que je veux décourager les gens de voter plusieurs fois.

Si votre principale préoccupation est d’empêcher quelqu’un d’écrire un script et de soumettre automatiquement le formulaire plusieurs fois, vous pouvez utiliser CAPTCHA avec votre formulaire.

Plusieurs pays entiers sont NAT’ed, et quelques-unes (la plupart?) De grandes sociétés multinationales, dont beaucoup comptent plusieurs centaines de milliers d’utilisateurs. Bloquer tout par IP est une mauvaise idée.

Optez plutôt pour un cookie, ce qui est tout aussi bon que cela. Vous pouvez également vous connecter à l’utilisateur, auquel cas vous saurez si le formulaire a été soumis à plusieurs resockets pour cette connexion.

J’utiliserais l’identifiant de session et stockerais les envois de formulaires dans un tableau avec l’identifiant de session, l’horodatage et éventuellement une sorte d’identifiant de formulaire. Ensuite, lorsqu’un formulaire est soumis, vous pouvez vérifier la table pour vous assurer que cela ne s’est pas produit dans un certain délai.

Filtrer sur l’adresse IP et / ou les cookies sont tous deux faciles à contourner, mais ils empêcheront l’utilisateur occasionnel de soumettre accidentellement les mêmes éléments à plusieurs resockets en raison des embûches du navigateur, de l’impatience, etc.

Si vous voulez quelque chose de mieux que cela, vous pouvez implémenter la connexion, mais bien sûr, cela empêche beaucoup d’utilisateurs de répondre.

Ajoutez au formulaire un numéro d’identification croissant de façon monotone dans un champ masqué.

Au fur et à mesure que chaque formulaire est soumis, enregistrez-le dans une liste / carte “utilisée” (ou marquez-le utilisé, ou autre chose, détail de l’implémentation).

Si vous obtenez le même identifiant une seconde fois (si c’est déjà dans votre carte utilisée), informez-en l’utilisateur qu’il a soumis deux fois.

Bien que rien ne soit infaillible, je suggérerais quelque chose comme ceci: Lorsqu’un utilisateur charge la page avec votre formulaire, un cookie est défini et la valeur du cookie est ajoutée avec une chaîne secrète fixe et la valeur md5 de ceci est écrite dans un champ caché sur le formulaire. Assurez-vous qu’une nouvelle valeur est générée chaque fois que l’utilisateur accède au formulaire.

Lorsque l’utilisateur soumet le formulaire, vous vérifiez que la valeur du cookie et la valeur du formulaire correspondent, que le cookie que l’utilisateur a reçu n’a pas été utilisé pour soumettre le formulaire auparavant et que l’ID du référent correspond à l’URL du formulaire. Vous pouvez également vous assurer qu’aucune tentative de publication depuis cette IP n’a été effectuée au cours des 2 dernières minutes (suffisamment rapide pour que cela n’affecte pas la plupart des utilisateurs, mais assez lente pour ralentir les robots).

Pour résoudre ce problème, l’utilisateur doit créer un script qui charge la page, stocke les cookies et soumet les valeurs correctes. C’est beaucoup plus difficile que si l’utilisateur pouvait simplement soumettre le formulaire.

Ajouté Basé sur edit : je bloquerais les utilisateurs dans le framework Django. Cela vous permet de présenter un meilleur message d’erreur à l’utilisateur et vous ne le bloquez que de ce formulaire.

C’est une question d’authentification et d’autorisation, qui sont liées mais pas les mêmes. Afin de gérer l’autorisation, vous devez d’abord authentifier (identifier de manière fiable) l’utilisateur.

Si vous voulez que cela résiste à une mauvaise utilisation intentionnelle, vous allez vous retrouver avec non seulement des noms d’utilisateur et des mots de passe, mais aussi des demandes d’informations qui identifient personnellement vos utilisateurs. Les cœurs saignants et les gauchers pleureront sans cesse sur l’intrusion dans la vie privée, mais en fait vous faites exactement la même chose qu’une banque et pour exactement les mêmes raisons.

C’est beaucoup de travail et peut être affecté par la loi. Voulez-vous vraiment le faire?

Les méthodes suivantes sont toutes relativement simples à mettre en œuvre et à pirater. N’importe qui avec Firebug et un peu de connaissance ne clignotera même pas.

Le code JavaScript suivant utilise Mootools, et je ne l’ai pas vérifié pour ne pas avoir de bogue. Je comprends que la syntaxe JQ est presque identique et que JS brut est assez similaire, donc le sharepointvrait être clair.

1) Si le formulaire est envoyé via AJAX, vous pouvez vérifier avant de le soumettre (désolé si je ne fais que mentionner l’évidence).

var sent = 0; $('myForm').addEvent('submit', function(){ if(!sent) this.send(); }) 

C’est vraiment simple et étonnamment efficace jusqu’à ce qu’ils rechargent la page.

2) Ajouter un cookie JavaScript. Encore une fois, avec Mootools:

 $('myForm').addEvent('submit', function(){ if(Cookie.read('submitted')){ alert('once only'); return false;} else{ Cookie.write('submitted', 1); return true; } }) 

Cela fonctionnera même si l’utilisateur recharge la page.

3) Ajoutez un cookie de session Python. Je ne suis pas familier avec Python, mais si c’est comme PHP, cela n’aura aucun avantage sur la méthode 2. Dans les deux cas, l’utilisateur peut supprimer le cookie avec FireCookie ou WebDeveloper Toolbar (ou leur équivalent sur d’autres navigateurs) et recharger la page .

4) Ajoutez un cookie Flash (utilisez Flex). C’est idéal – les cookies Flash sont stockés dans un endroit différent, ne sont pas évidents et sont très difficiles à supprimer. Le seul inconvénient est que vous devez créer et intégrer un petit swf.

5) Stocker une valeur dans un champ masqué et vérifier la valeur. Un hachage peut être ajouté aux liens internes pour garantir que la valeur rest remplie même si la page est éloignée.

6) D’autres jeux peuvent être joués en incrémentant une URL (ou une URL personnalisée à l’aide de htaccess) pour chaque visiteur.

Un cookie swf est la meilleure idée de ce qui précède, même s’il peut être combiné avec les autres.