J'ai quelques anomalies sur mon site qui ne peuvent s'expliquer que si une même requête POST est envoyée presque à la suite, en fait avant même que la première soit complètement exécutée.
Pour vous donner une idée, cette requête déclenche six opérations d'écriture en base de donnée que je journalise par ailleurs. Une première a été faite à 57 secondes et 159200 microsecondes, la deuxième à 160900 µs, une troisième à 163600 µs, puis avant la quatrième attendue, j'ai une autre opération qui reprend la première toujours dans la 57e seconde mais à 443800 µs. Les deux demandes ont été lancées à 0,28 secondes d'écart.
C'est un problème rare, que je n'ai pas pu reproduire, mais qui ne semble pas tout à fait isolé. Il semble que, parfois, le navigateur peut envoyer deux requêtes POST l'une à la suite de l'autre, peut-être un double clic sur le bouton d'envoi. J'ai trouvé une discussion sur StackOverflow évoquant la problématique.
Je m'interroge sur la solution à apporter.
Il est évoqué la possibilité de mettre un code en JS pour désactiver le bouton d'envoi dès après le premier click. Les inconvénients soulevés ne me dérangent pas trop, il me semble rare que JS soit désactivé (ce qui poserait d'autres problèmes par ailleurs sur mon site), et je veux surtout éviter une fausse manip' plutôt que prévenir un acte malveillant (le fait que ça soit géré côté client ne me dérange pas). Par contre, point positif, ce serait très simple à rajouter, je pourrais même faire un script global qui s'adapte à tout
Je me demande surtout si c'est suffisamment efficace.
L'autre solution proposée serait de créer un jeton de type GUID ou autre, de le stocker côté serveur, et de le fournir au formulaire via un champ caché. Lorsque le formulaire est soumis, si le jeton existe côté serveur, le jeton est supprimé et le script se poursuit, si le jeton est absent le script génère une erreur. Cela demande plus de travail pour corriger cela sur tout le projet, mais si je comprends bien le mécanisme, cela pourrait en même temps permettre d'éviter les attaques de type CSRF (que je gère actuellement par un jeton de session).
Est-ce que ce mécanisme est également efficace pour se prémuniqu d'une attaque CRSF ?
Où préconisez-vous d'enregistrer ce jeton ? en BDD dans la session ?
Pour vous donner une idée, cette requête déclenche six opérations d'écriture en base de donnée que je journalise par ailleurs. Une première a été faite à 57 secondes et 159200 microsecondes, la deuxième à 160900 µs, une troisième à 163600 µs, puis avant la quatrième attendue, j'ai une autre opération qui reprend la première toujours dans la 57e seconde mais à 443800 µs. Les deux demandes ont été lancées à 0,28 secondes d'écart.
C'est un problème rare, que je n'ai pas pu reproduire, mais qui ne semble pas tout à fait isolé. Il semble que, parfois, le navigateur peut envoyer deux requêtes POST l'une à la suite de l'autre, peut-être un double clic sur le bouton d'envoi. J'ai trouvé une discussion sur StackOverflow évoquant la problématique.
Je m'interroge sur la solution à apporter.
Il est évoqué la possibilité de mettre un code en JS pour désactiver le bouton d'envoi dès après le premier click. Les inconvénients soulevés ne me dérangent pas trop, il me semble rare que JS soit désactivé (ce qui poserait d'autres problèmes par ailleurs sur mon site), et je veux surtout éviter une fausse manip' plutôt que prévenir un acte malveillant (le fait que ça soit géré côté client ne me dérange pas). Par contre, point positif, ce serait très simple à rajouter, je pourrais même faire un script global qui s'adapte à tout
button de type submit d'un form avec method="post".Je me demande surtout si c'est suffisamment efficace.
L'autre solution proposée serait de créer un jeton de type GUID ou autre, de le stocker côté serveur, et de le fournir au formulaire via un champ caché. Lorsque le formulaire est soumis, si le jeton existe côté serveur, le jeton est supprimé et le script se poursuit, si le jeton est absent le script génère une erreur. Cela demande plus de travail pour corriger cela sur tout le projet, mais si je comprends bien le mécanisme, cela pourrait en même temps permettre d'éviter les attaques de type CSRF (que je gère actuellement par un jeton de session).
Est-ce que ce mécanisme est également efficace pour se prémuniqu d'une attaque CRSF ?
Où préconisez-vous d'enregistrer ce jeton ? en BDD dans la session ?