Système de captcha pour le post invité #51
Labels
No Label
Core
bug
duplicate
easy
enhancement
help wanted
invalid
performance
proposal
question
security
warning
wontfix
No Milestone
No Assignees
3 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: devs/PCv5#51
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Y'en a pas. Du coup les bots peuvent se faire plaisir…
Je viens de voir passer un post qui parle d'utiliser un honeypot pour éviter les spams. Leur implémentation est en Flask, disponible sur Github.
Je connaissais l'astuce, à priori ça marche pas mal. Leur code est foireux je trouve, mais avec un validateur custom on peut s'en sortir beaucoup plus facilement.
En tout cas ça peut faire une première protection anti-spam, et si ça marche pas on fera un captcha.
Je m'occupe de ça. J'aime bien le principe puisque ça ne gêne pas les utilisateurs humains, je pense que c'est un bon plan.
(Ça n'empêche pas quelqu'un qui programme un bot spécifique pour le site de poser des problèmes. Mais comme on un pseudo-Captcha maison très faible sur la v43, on a déjà ce problème-là et quand même peu de spam ; donc je ne crois pas que ce soit très gênant.)
Un validateur personnalisé ne serait pas du honeypot parce que ça renverrait une erreur durant la soumission par un bot (et attirerait donc l'attention du spammeur). Je pense qu'il faudra donc quand même une ligne de code à chaque utilisation du champ après validation.
Quelque chose que j'ai bien aimé en cherchant des détails sur cette méthode, c'est une partie de cette réponse StackOverflow :
Comme on ne demande pas l'email des invités je pense que je vais mettre exactement ça en me débrouillant pour que le champ soit invisible mais pas d'une façon trop évidente (pour emmerder les bots triviaux qui n'utilisent pas un navigateur headless).
En fin de compte j'ai réussi à m'en sortir à moindres frais.
Dans le formulaire :
Dans le template :
Et tout le reste est identique.
Attention à ne pas donner de nom explicite genre
antibot
à la variable, puisque c'est utilisé comme nom de champ dans le HTML généré.En interne c'est un
EmailField
qui demande "l'email" avec le type et le label qui vont bien. Si la champ est rempli durant une soumission leform.validate_on_submit()
renvoieFalse
et donc (en général, compte tenu de la façon dont on code nos routes) la page avec le formulaire est re-renvoyée.Problème sur la prod.
Est-ce que vous avez testé le système ?
Actuelement le champ pour l'e-mail est affiché aux invités, si on le rempli on ne peut pas envoyer le formulaire avec une adresse mail "invalide" mais le post n'est pas pris en compte si y'a une adresse mail.
Il faut cacher le champ email aux utilisateurs.
Si l'utilisateur utilise la touche tab pour se déplacer il n'aura pas de problème mais on doit cacher le champ pour tous ceux qui n'utilisent pas la navigation au clavier (et pour les téléphones)
Ça devrait être bon. La règle CSS qui cache le champ était ignorée au profit d'une règle plus spécifique. Le commitc ci-dessus modifie la règle pour rétablir la priorité.
Le champ étant
display: none
, peu importe la méthode de navigation il doit être impossible de le focus de façon conventionnelle.Je confirme ça marche.