8796 sujets

Développement web côté serveur, CMS

Bonjour les Alsanautes ! Smiley smile


Je réfléchissais toute à l'heure aux mécanismes de protection contre le spam, et j'ai eu une idée. J'aimerais vous en faire part, pour qu'éventuellement vous me disiez ce que vous en pensez. Je n'ai pas d'énormes connaissances vis-à-vis des systèmes employés par les spammeurs, d'où mon interrogation. Sur le principe ça peut fonctionner, mais la pratique, hein... Smiley lol

Bref. Imaginez un formulaire banal comme un booléen, sur lequel on ajoute un champ de type hidden dont la valeur correspond au moment où la page a été affichée (un timestamp UNIX, par exemple). Ensuite, lors de la procédure de soumission, on crée une seconde variable contenant elle aussi un timestamp, celui correspondant au moment où la page a été soumise.

Si l'écart entre les deux est trop faible, cela pourrait signifier qu'il s'agissait soit d'une soumission automatique (je crois ?), soit d'un copier/coller (dans le cas où le formulaire contient un textarea et que l'utilisateur écrit d'abord au notepad au cas où son navigateur lâcherait et qu'il ait à tout retaper).

A votre avis, c'est jouable ? Il serait éventuellement intéressant (j'espère), de tester sur un formulaire qui se fait souvent attaquer, si quelqu'un est preneur je serais ravis d'avoir son retour. Smiley smile
Salut,

Avec cette méthode tu ne seras jamais sûr à 100% de :
1. bloquer les robots spammeurs,
2. ne pas bloquer une vraie soumission de formulaire.

La meilleure solution contre le spam reste le captcha ou la question "simplifiée".
Oui, évidemment : la solution parfaite n'existe pas encore. Smiley cligne
Ceci dit, même si j'envisage de tester (me faudrait déjà refaire un site ! Smiley biggol ), je ne pense pas limiter la protection à un mécanisme du genre. Smiley smile

Les captchas, ça marche bien certes, mais je trouve ça chiant au possible. Surtout que si on veut que ça soit performant, on doit brouiller au maximum et dans ce cas-là, même un humain peut se planter. Par contre, j'ignore si quelqu'un a testé le "cliquez sur le chiffre" visible sur ClodoGame.fr, ça m'a l'air d'assez bien marcher.

Bref, revenons-en à nos timestamps. Smiley langue

Vis-à-vis des robots, à vrai dire n'ayant pas de réelles connaissances dans ce domaine, j'ignore comment ça se passe exactement. J'imagine que le formulaire est rempli en moins d'une seconde puis soumis, non ? Auquel cas, un écart de moins de cinq secondes pourrait signifier qu'on a à faire à un bot ?
SolykZ a écrit :
Bref, revenons-en à nos timestamps.

Quel intérêt vu que ce n'est pas une méthode fiable ?
Ce n'est peut-être pas fiable à lui seul, mais ça peut être utile couplé à autre chose.
c'est humainement pas possible de remplir un formulaire en moins de 3 secondes. Donc, c'est un moyen supplémentaire de détecter un bot. Par contre les bots intelligents attendront un peu, donc il faut une autre protection en parralèle.

Je le rappelle au cas où, mais attention avec les captchat basés sur des images : c'est pas accessible. Il faut toujours prévoir un second canal de communication. Par exemple, un captchat audio. C'est toujours pas 100% accessible, mais c'est déjà mieux, et puisque de toute façon on n'a pas encore réussi à inventer un captchat qui soit à la fois accessible et bloquant effectivement les bots, on fait comme on peut.
QuentinC a écrit :
c'est humainement pas possible de remplir un formulaire en moins de 3 secondes. Donc, c'est un moyen supplémentaire de détecter un bot.

Sauf si on a un add-on Firefox qui permet de remplir automatiquement les formulaires.

QuentinC a écrit :
Je le rappelle au cas où, mais attention avec les captchat basés sur des images : c'est pas accessible. Il faut toujours prévoir un second canal de communication. Par exemple, un captchat audio. C'est toujours pas 100% accessible, mais c'est déjà mieux, et puisque de toute façon on n'a pas encore réussi à inventer un captchat qui soit à la fois accessible et bloquant effectivement les bots, on fait comme on peut.

Une solution accessible et efficace est donc la question "simplifiée".

Exemple : Entrez dans la case ci-contre le résultat de cette opération : 2 + 2


Sachant que l'on peut en plus dynamiser les chiffres, si on prend par exemple deux chiffres aléatoirement entre 0 et 5. Donc impossible pour un robot spammeur de savoir à l'avance quel nombre entrer dans le champ, et facilement réalisable pour un être humain, puisque l'opération la plus grande est 5 + 5.
Modifié par Agylus (22 Sep 2009 - 10:29)
a écrit :
Sauf si on a un add-on Firefox qui permet de remplir automatiquement les formulaires.

Je doute qu'une machine puisse deviner quoi écrire où avant que tu ne lui dise. A part pour un login/password, éventuellement.


a écrit :
Exemple : Entrez dans la case ci-contre le résultat de cette opération : 2 + 2

Si le spameur veut vraiment faire chier, il peut toujours récupérer les chiffrs via regexp et faire le calcul. Non. Le mieux est une question ouverte du genre « quelle est la couleur du cheval blanc d'Henri IV ? » qui change aléatoirement.
Hello ! Smiley smile

L'intérêt, Agylus, est que cela m'intéresse, tout simplement ! D'ailleurs, QuentinC a soulevé un point important vis-à-vis des captchas (merci à toi Smiley cligne ), celui de l'accessibilité. Sur le coup j'avoue ne pas y avoir réfléchi, je fais des efforts pour rendre mon code tout à fait accessible, mais je n'ai pas encore tous les réflexes. Smiley confused Bref, ça ajoute un poids non-négligeable dans la balance qui va contre. Smiley cligne

Par ailleurs je n'imaginais certes pas utiliser un système du style à lui seul. Bref, j'ai eu une idée, je l'ai soumise pour récolter vos avis, sans plus. Si à terme ça m'aide à obtenir une solution qui soit confortable et efficace, tant mieux. Si pas, j'aurai au moins une base plus stable pour continuer à y réfléchir.

Oui, donc effectivement, le type de formulaire ciblé par une protection du genre serait un formulaire contenant, par exemple, un textarea (la cible préférée des spambots, j'imagine, pour proposer des liens pour du viagra, tout ça...). Un formulaire type connexion pouvant, oui, être auto-complété par les navigateurs, ça n'aurait aucun sens. Smiley cligne

J'avais posté le sujet sur d'autres forums aussi, histoire de rassembler un maximum d'avis. Sur le SdZ on m'a suggéré de ne pas utiliser un champ hidden pour stocker le timestamp d'affichage de la page, celui-ci pouvant être lu via le code source, mais bien une session en PHP. C'est tout à fait jouable, ça reste très simple à mettre en œuvre et plus rien n'est visible côté client (enfin, je crois).
Modérateur
Hello tout le monde,

Ha, ha ! l'idée du formulaire unique avec sa propre signature numérique. Quelle bonne idée. Smiley smile

Agylus a écrit :

...
Avec cette méthode tu ne seras jamais sûr à 100% de :
1. bloquer les robots spammeurs,
...


Je ne suis pas tout à fait d'accord avec toi. Il y a des petites astuces me semble t'il ? (voir ci-après)

Agylus a écrit :

...
Une solution accessible et efficace est donc la question "simplifiée".

Exemple : Entrez dans la case ci-contre le résultat de cette opération : 2 + 2


Sachant que l'on peut en plus dynamiser les chiffres, si on prend par exemple deux chiffres aléatoirement entre 0 et 5. Donc impossible pour un robot spammeur de savoir à l'avance quel nombre entrer dans le champ, et facilement réalisable pour un être humain, puisque l'opération la plus grande est 5 + 5.


+1 -> QuentinC et Agylus
C'est la méthode la plus fiable, la plus accessible et la plus simple à mettre en place. (Pourquoi faire compliqué quand on peut faire simple, n'est ce pas ?) Surtout que certaines images de captcha sont totalement illisibles (beaucoup trop d'effet). J'imagine une personne handicapé voulant remplir un formulaire avec un webmaster se lachant un peu trop sur l'objet magicwand ou imagemagique. Smiley sweatdrop

Faisons fonctionner nos neurones quelques instants afin d'améliorer l'ergonomie de l'application : Smiley murf

//un Formulaire
<?php
$valeurCookieunFormulaire = "sel".$_SERVER["REMOTE_ADDR"];
setcookie("unFormulaire",sha1($valeurCookieunFormulaire),time()+24*3600,"/","www.mon_site.com");
?>
	<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
		<input type="submit" />
	</form>


//controle du formulaire
if(!empty($_COOKIE["unFormulaire"]) || sha1("sel".$_SERVER["REMOTE_ADDR"]) !== $_COOKIE["unFormulaire"]){
	//effacement et redirection
	setcookie("unFormulaire");
	header("location:unFormulaire.php");
} 

Fais de tête. Je peux m'être trompé.
À noter qu'il est tout à fait possible d'améliorer grandement cette idée en personnalisant un peu plus et en utilisant des variables de session.

<<<EDIT
SolykZ a écrit :

Sur le SdZ on m'a suggéré de ne pas utiliser un champ hidden pour stocker le timestamp d'affichage de la page, celui-ci pouvant être lu via le code source, mais bien une session en PHP.

Ne pas oublier que la valeur de ton champ hidden peut être totalement personnalisée : un peu de sel + affichage perso du timestamp (mardi25avril20052heuredumat25minutes15secondes) + str_rot13 + sha1 ou autres méthodes de hachage. Smiley cligne
EDIT;

++

Note au modérateur : petit problème d'édition du code. Erreur de rendu lors de l'utilisation du bbcode (code=php et /code).
Modifié par Nolem (27 Sep 2009 - 15:42)
Salut,

je suis de l'avis d'Agylus : aucun intérêt d'utiliser un timestamp. Au-delà des extensions de Firefox il suffit de réafficher le formulaire après une erreur pour qu'il y ait besoin de moins de 5 secondes pour le resoumettre .

Nolem a écrit :
Faisons fonctionner nos neurones quelques instants
Euh OK : qui commence ? Smiley langue

En l'état ton code ne peut pas fonctionner mais c'est pire en le corrigeant : je suppose que tu parlais de quelque chose comme ça...
$valeurCookieunFormulaire = "sel".$_SERVER["REMOTE_ADDR"];

//controle du formulaire
if(!empty($_COOKIE["unFormulaire"]) && sha1("sel".$_SERVER["REMOTE_ADDR"]) === $_COOKIE["unFormulaire"]){
	//effacement et redirection
	setcookie("unFormulaire", "", time()-3600, "/");
	header("location: autrepage.php");
} else {
	setcookie("unFormulaire", sha1($valeurCookieunFormulaire), time()+24*3600, "/");
}
sauf que :

1) même un bot spammeur possède une IP donc je ne vois pas en quoi ça le gênerait.

2) avec ce système (qui à priori ne sert de toutes façons à rien) il est impossible de réafficher le formulaire en cas d'erreur puisque le cookie existe et qu'on est alors redirigé.
Modérateur
Hello Heyoan,

Heyoan a écrit :

...
aucun intérêt d'utiliser un timestamp. Au-delà des extensions de Firefox il suffit de réafficher le formulaire après une erreur pour qu'il y ait besoin de moins de 5 secondes pour le resoumettre.
...
1) même un bot spammeur possède une IP donc je ne vois pas en quoi ça le gênerait.
...


Au contraire, le timestamp peut être utile. $_SERVER["REMOTE_ADDR"] permet « d'identifier » ton interlocuteur. Néanmoins, j'ai également mis du sel dans cette string, n'est ce pas ?
En préparant bien ta recette de cuisine,
$sel peut être égale à une string personnelle (ex : 2Enf@nt$ -> de grands enfants)
$sel peut être égale à $timestampSoumissionFormulaire
$sel peut être égale à uniqid(mt_rand())
$sel peut être égale à $_SERVER['REQUEST_URI']
$sel peut être aux trois/quatre expressions précédentes suivant un ou plusieurs caractère(s) de séparation mis côte à côte.

si $timestampSoumissionFormulaire + 3 > time(), ce même motif réapparait, redirection invitant l'utilisateur à attendre 3 secondes avant l'envoi du formulaire ou redirection sur le formulaire tout simplement.

À propos de mon code, en effet oups , je suis allé un peu vite en besogne. Je veux dire un truc du style :


if(empty($_COOKIE["unFormulaire"]) || sha1("sel".$_SERVER["REMOTE_ADDR"]) !== $_COOKIE["unFormulaire"]){
	//effacement et redirection
	setcookie("unFormulaire");
	unset ($_COOKIE["unFormulaire"]);
	header("location:unFormulaire.php");
} 


Heyoan a écrit :

...
2) avec ce système (qui à priori ne sert de toutes façons à rien) il est impossible de réafficher le formulaire en cas d'erreur puisque le cookie existe et qu'on est alors redirigé.


Pas obligatoirement, me semble t'il :

if(!empty($_POST["champHidden"]) && $_POST["champHidden"] == "valeur"){
	if(empty($_COOKIE["unFormulaire"]) ...
	...
}else{
	redirection vers le formulaire
}


J'avoue que c'est beaucoup de travail. Cependant, on factorise le tout et on évite :
* le traditionnel captcha (illisible)
* la saisie d'un champ supplémentaire (oups, je démontre mon côté fainéant lors de la saisie du formulaire) Smiley confused euh..., suis je le seul ?

Pour finir, je crois que c'est tout à fait faisable d'éviter le traditionnel Captcha. Après je peux me tromper...

ps :
* code fais de tête. Je peux m'être trompé.
* Un bout de moquette « syou plait » Smiley lol
Modifié par Nolem (27 Sep 2009 - 18:59)
Re',

Nolem a écrit :
Au contraire, le timestamp peut être utile.
Euh... si tu veux dire d'une manière générale oui ! Smiley langue

Pas dans ce cas précis d'après moi...

Nolem a écrit :
$_SERVER["REMOTE_ADDR"] permet « d'identifier » ton interlocuteur.
Et donc ?

Nolem a écrit :
Néanmoins, j'ai également mis du sel dans cette string, n'est ce pas ?
En préparant bien ta recette de cuisine,
$sel peut être égale à une string personnelle (ex : 2Enf@nt$ -> de grands enfants)
...
$sel peut être égale à uniqid(mt_rand())
$sel peut être égale à $_SERVER['REQUEST_URI']
$sel peut être aux trois/quatre expressions précédentes suivant un ou plusieurs caractère(s) de séparation mis côte à côte.
Et donc ?