318 votes

Des approches CAPTCHA pratiques non basées sur l'image?

Il semble que nous allons ajouter de CAPTCHA soutien à Débordement de Pile. Cela est nécessaire pour empêcher les bots, les spammeurs et autres malveillants activité scénarisée. Nous ne voulons que des êtres humains, de publier ou de modifier des choses ici!

Nous allons utiliser un JavaScript (jQuery) CAPTCHA comme une première ligne de défense:

http://docs.jquery.com/Tutorials:Safer_Contact_Forms_Without_CAPTCHAs

L'avantage de cette approche est que, pour la plupart des gens, le CAPTCHA ne sera jamais visible!

Toutefois, pour les personnes avec le JavaScript désactivé, nous avons encore besoin de secours, et c'est là que ça devient délicat.

J'ai écrit un traditionnel CAPTCHA de contrôle pour ASP.NET qui nous peut ré-utiliser.

CaptchaImage

Cependant, je préfère aller avec quelque chose textuelle pour éviter la surcharge de la création de toutes ces images sur le serveur à chaque requête.

J'ai vu des choses comme..

  • Texte ASCII captcha: \/\/(_)\/\/
  • exercices de maths: qu'est-ce que 7 moins 3 fois 2?
  • trivia questions: quoi de meilleur goût, un crapaud ou une glace à l'eau?

Peut-être que je suis juste contre des moulins à vent ici, mais j'aimerais avoir un moins de ressources, non de l'image en fonction <noscript> compatible CAPTCHA si possible.

Des idées?

211voto

ceejayoz Points 85962

205voto

GateKiller Points 19113

Une méthode que j'ai développée et qui semble fonctionner parfaitement (bien que je n'ai probablement pas obtenir beaucoup de commentaires de spam que vous), c'est d'avoir un champ caché et de le remplir avec une fausse valeur, par exemple:

<input type="hidden" name="antispam" value="lalalala" />

J'ai ensuite un morceau de code JavaScript qui met à jour la valeur de chaque seconde avec le nombre de secondes, la page a été chargée de:

var antiSpam = function() {
        if (document.getElementById("antiSpam")) {
                a = document.getElementById("antiSpam");
                if (isNaN(a.value) == true) {
                        a.value = 0;
                } else {
                        a.value = parseInt(a.value) + 1;
                }
        }
        setTimeout("antiSpam()", 1000);
}

antiSpam();

Puis, quand le formulaire est soumis, Si l'antispam valeur est toujours "lalalala", alors je le marquer comme spam. Si l'antispam valeur est un entier, je vérifie pour voir si elle est au-dessus de quelque chose comme 10 (secondes). Si c'est en dessous de 10, je le marquer comme spam, si c'est 10 ou plus, je le laisser passer.

If AntiSpam = A Integer
    If AntiSpam >= 10
        Comment = Approved
    Else
        Comment = Spam
Else
    Comment = Spam

La théorie étant que:

  • Un robot de spam ne sera pas en charge JavaScript et de présenter ce qu'il voit
  • Si le bot prend en charge JavaScript, il sera de soumettre le formulaire instantanément
  • L'intervenant a au moins lu certains de la page avant de poster

L'inconvénient de cette méthode est qu'elle nécessite l'activation de JavaScript, et si vous n'avez pas activé JavaScript, votre commentaire sera marqué comme spam, cependant, je dois examiner les commentaires marqués comme spam, ce n'est donc pas un problème.

Réponse aux commentaires

@MrAnalogy: Le côté serveur approche semble tout à fait une bonne idée et c'est exactement le même que le faire en JavaScript. Bon Appel.

@AviD: je suis conscient que cette méthode est sujette à des attaques directes comme je l'ai mentionné sur mon blog. Cependant, il va défendre contre la moyenne de votre robot de spam qui soumet aveuglément les déchets de toute forme qu'il peut trouver.

57voto

thing2k Points 413

À moins que je ne manque quelque chose, qu'est-ce qui ne va pas avec reCAPTCHA? Tout le travail est fait en externe.

Juste une pensée.

42voto

Rob Cooper Points 15945

L'avantage de cette approche est que, pour la plupart des gens, le CAPTCHA ne sera jamais visible!

J'aime cette idée, n'est-il pas de toute façon, il nous suffit de les accrocher dans le système de rep? Je veux dire, quelqu'un avec dire +100 rep est susceptible d'être un être humain. Donc, si ils ont rep, vous devez même pas la peine de faire quelque CHOSE en termes de CAPTCHA.

Puis, si elles ne sont pas, puis de l'envoyer, je suis sûr que cela ne prendre que de nombreux postes à arriver à 100 et la communauté instantanément plongée sur n'importe qui semblent être spammé avec l'offensive des balises, pourquoi ne pas ajouter un "spam" lien downmods par 200? Obtenez 3 de ceux-ci, spambot achievement unlocked, bye bye ;)

EDIT: je dois aussi ajouter, j'aime les maths idée de la non-image CAPTCHA. Ou peut-être une simple énigme de type-chose. Peut faire l'affichage encore plus intéressant ^_^

37voto

lomaxx Points 32540

Qu'en est-il un captcha honeypot ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X