Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Formulaires spammés

57 réponses
Avatar
docanski
Bonjour,

Marre des spammeurs qui à la longue m'inondent de messages indésirables
par l'intermédiaire de mes formulaires ! J'ai cherché des solutions sur
le Web sans trouver celle que je voudrais mettre en oeuvre. Il y est le
plus souvent question de "captcha" sous forme de chaînes de caractères
générées aléatoirement par un script PHP mais celles-ci sont bien
souvent illisibles.
Comme l'essentiel des spams est fait de liens, que ceux-ci sont
répétitifs dans le même message, j'aimerais trouver un script à insérer
soit dans le formulaire, soit dans le script PHP de traitement de
celui-ci. Le principe serait soit d'interdire toute écriture d'un lien
comme ceci, par exemple :

if(armo.Avis.value == "http://")
armo.Avis.focus();
return false;}

(les noms armo et Avis sont repris d'un de mes formulaires visibles à
http://armorance.free.fr/formArmo.html)

soit de créer une condition du même genre mais dont le résultat serait
de refuser l'écriture de plus d'une chaîne de caractères *identique* de
7 lettres (par exemple) dans le même "textarea",
soit de créer ce même genre de contrôle mais dans le script PHP.
Malheureusement, l'âge et la mémoire :-( font que mes faibles notions de
JS que j'ai abandonnées depuis près de 10 ans ne me permettent plus de
coder une telle condition qui me paraît pourtant simple (le plus évident
étant toujours celui qu'on voit le moins ...) et pour ce qui est du PHP,
je suis une véritable bille.
Quelqu'un peut-il m'aider à réaliser ce petit script sur lequel je butte
sans trouver la solution ?

Cordialement,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/

10 réponses

1 2 3 4 5
Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
Olivier Miakinen ecrit ce qui suit en ce 03.08.2008 23:04 :
Bonjour,



Bonsoir,

... à moins que tu ne mettes le contenu du champ E-mail
directement dans le From d'un message que tu t'envoies.



Tout de même pas !

Il y a quelque temps, quelqu'un avait signalé qu'il suffisait de
demander la réponse à une question simple (du style « combien font
2+2 »), et il me semble même qu'on était arrivés à la conclusion
qu'il suffisait souvent de demander de recopier un texte fixe (du
style « pour la lutte anti-spam, mettez 4 dans le champ ci-contre »).
Pour cette dernière solution, il te suffirait de changer le texte si
jamais quelqu'un avait programmé un robot pour mettre 4, et tu serais
tranquille encore pour quelques mois...



J'ai lu quelques discussions à ce sujet mais les résultats paraissaient
mitigés, les robots bloqués par ce subterfuge étant, paraît-il,
"épaulés" par un opérateur humain. Je n'ai évidemment aucun a priori à
ce sujet mais le fait de devoir modifier à plus ou moins court terme ce
subterfuge le fait déjà mettre au second plan des choix possibles.

1) Tu dois le faire en PHP car ça ne sert à rien de le faire en JavaScript.



Le robot est capable de déchiffrer la condition ? Mickaël semblait
affirmer le contraire !?

2) if (strpos($_REQUEST['avis'], "http://") !== FALSE) {
include(page d'erreur);
exit;
}



le (page d'erreur) peut être écrit en dur comme ceci : (erreur.html) ?

J'aime bien l'idée que quelqu'un puisse souhaiter expressément recevoir
des courriers *indésirables*. ;-)



Voui, vu comme cela, la formulation n'est sans doute pas très heureuse.
Il va donc falloir changer ...

Pas une bonne idée, ÀMHA.

« Bonjour, j'ai adoré votre page sur les champignons car je suis
passionné de champignons et d'ailleurs je ne manque jamais une occasion
de partir à la recherche de nouveaux champignons. Savez-vous que le
champignon Trucmuche est le plus grand champignon de tous les... [etc] »



Ça, c'est un quidam qui veut voire référencer son message en bonne place
dans une requête dont le mot-clef sera "champignon" ! La vache ! il
risquerait de me rétrograder dans le classement ds moteurs de recherches
! :-)
Mais tu n'as pas tort.

Cordialement,



De même,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
Olivier Miakinen ecrit ce qui suit en ce 03.08.2008 23:16 :

Il est TRÈS dangereux de coder un envoi de courriel en PHP quand on ne
maîtrise pas parfaitement la bête.



Je te le soumets donc, pour obtenir ton approbation ;-) :

<?php
if(isset($_POST['submit'])) {
$destinataire = '';
$titre = 'formulaire Armorance';
$message = '';
foreach($_POST as $cle => $valeur) {
if (($cle <> 'submit') and ($cle <> 'reset')) {
$message .= str_pad($cle, 20) . $valeur . "n";
}
}
mail($destinataire, $titre, $message, 'From: '.$destinataire);
header('Location: http://armorance.free.fr/index.htm');
exit;
}
?>

Il ne doit pas poser problème, me semble-t'il ?

Au fait, ton champ hidden nommé
« Sujet&nbsp;du&nbsp;courrier&nbsp;: » me fait particulièrement peur.
Si ça se trouve, ton formulaire est utilisé pour spammer la terre
entière, et c'est pour ça qu'il intéresse tant les spammeurs.



Celui-ci :
<input type="hidden" name="Mail Subj" value="Formulaire Armorance" />
?
J'ai du mal à voir là une cause de spam planétaire ... :-(

Cordialement,



De même,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
Olivier Miakinen
Le 03/08/2008 23:32, docanski a écrit :

... à moins que tu ne mettes le contenu du champ E-mail
directement dans le From d'un message que tu t'envoies.



Tout de même pas !



Et le champ « Sujet&nbsp;du&nbsp;courrier&nbsp;: », tu le mets
directement dans le Subject ?

Il y a quelque temps, quelqu'un avait signalé qu'il suffisait de
demander la réponse à une question simple (du style « combien font
2+2 »), et il me semble même qu'on était arrivés à la conclusion
qu'il suffisait souvent de demander de recopier un texte fixe (du
style « pour la lutte anti-spam, mettez 4 dans le champ ci-contre »).
Pour cette dernière solution, il te suffirait de changer le texte si
jamais quelqu'un avait programmé un robot pour mettre 4, et tu serais
tranquille encore pour quelques mois...



J'ai lu quelques discussions à ce sujet mais les résultats paraissaient
mitigés, les robots bloqués par ce subterfuge étant, paraît-il,
"épaulés" par un opérateur humain. Je n'ai évidemment aucun a priori à
ce sujet mais le fait de devoir modifier à plus ou moins court terme ce
subterfuge le fait déjà mettre au second plan des choix possibles.



Certains craignaient qu'il faille le changer à terme, mais ça n'était
qu'une crainte non fondée sur l'expérience. Cela dit, si ça t'ennuie
vraiment de devoir changer un texte fixe tous les 24 mois (à la louche),
tu peux prévoir dès le début un texte variable, voire le résultat d'une
opération simple. Mais bon, tu fais bien comme tu veux, hein, pourvu que
ton formulaire ne spamme que toi-même !

1) Tu dois le faire en PHP car ça ne sert à rien de le faire en JavaScript.



Le robot est capable de déchiffrer la condition ? Mickaël semblait
affirmer le contraire !?



Quelle condition aurait-il besoin de déchiffrer puisque la fonction de
contrôle n'est pas appelée du tout et que le formulaire est envoyé avec
les valeurs que veut y mettre le spammeur, sans aucune restriction ?
Note qu'il n'a même pas besoin de passer par ta page HTML, ni d'ailleurs
par aucune page HTML, pour envoyer une requête POST.

Au fait, as-tu reçu un ou deux formulaires de ma part, ou aucun ?

2) if (strpos($_REQUEST['avis'], "http://") !== FALSE) {
include(page d'erreur);
exit;
}



le (page d'erreur) peut être écrit en dur comme ceci : (erreur.html) ?



Oui, à condition de l'entourer de guillemets : include('erreur.html');

« Bonjour, j'ai adoré votre page sur les champignons car je suis
passionné de champignons et d'ailleurs je ne manque jamais une occasion
de partir à la recherche de nouveaux champignons. Savez-vous que le
champignon Trucmuche est le plus grand champignon de tous les... [etc] »



Ça, c'est un quidam qui veut voire référencer son message en bonne place
dans une requête dont le mot-clef sera "champignon" ! La vache ! il
risquerait de me rétrograder dans le classement ds moteurs de recherches
! :-)



Euh... parce que les messages privés qu'on t'envoie via ce formulaire
sont publiés sur le web ?

Mais tu n'as pas tort.



C'était -- bien sûr -- un exemple extrême.
Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
Olivier Miakinen ecrit ce qui suit en ce 03.08.2008 23:16 :

Ben non, puisque personne n'exécutera aucun script lors du submit.
D'ailleurs je viens de faire l'essai de soumettre un formulaire sans
remplir les champs dits obligatoires, simplement en désactivant JS au
moment de l'envoi. Tu me diras si tu l'as reçu.



Je les ai reçu tous les deux et le champ "to" que tu as complété à
l'insu de mon plein gré dans le second m'interpelle : comment cette
manoeuvre est-elle possible ... et comment l'éviter ?

Au fait, ton champ hidden nommé
« Sujet&nbsp;du&nbsp;courrier&nbsp;: » me fait particulièrement peur.



Ah oui, c'est vrai : contrairement à ce que j'ai écrit dans mon autre
réponse, ce champ existe bien avec cette chaîne. Je n'avais pas vérifié
sur site mais seulement dans mes archives de "sauvetage". Comme quoi
j'ai dû en oublier un.

Si ça se trouve, ton formulaire est utilisé pour spammer la terre
entière, et c'est pour ça qu'il intéresse tant les spammeurs.



Ton truc "to" est une vacherie, en effet :-(.
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
Olivier Miakinen
Le 03/08/2008 23:54, docanski a écrit :

Je te le soumets donc, pour obtenir ton approbation ;-) :

<?php
if(isset($_POST['submit'])) {
$destinataire = '';
$titre = 'formulaire Armorance';



Ah, c'est en dur ? Pas de problème alors. Je craignais ceci :
$titre = $_POST['Sujet_du_courrier_:'];

$message = '';
foreach($_POST as $cle => $valeur) {
if (($cle <> 'submit') and ($cle <> 'reset')) {
$message .= str_pad($cle, 20) . $valeur . "n";
}
}
mail($destinataire, $titre, $message, 'From: '.$destinataire);
header('Location: http://armorance.free.fr/index.htm');
exit;
}
?>

Il ne doit pas poser problème, me semble-t'il ?



Non, en effet. Pas si $destinataire et $titre sont codés en dur.

Au fait, ton champ hidden nommé
« Sujet&nbsp;du&nbsp;courrier&nbsp;: » me fait particulièrement peur.
Si ça se trouve, ton formulaire est utilisé pour spammer la terre
entière, et c'est pour ça qu'il intéresse tant les spammeurs.



Celui-ci :
<input type="hidden" name="Mail Subj" value="Formulaire Armorance" />
?
J'ai du mal à voir là une cause de spam planétaire ... :-(



Si tu avais mis $_POST['Sujet_du_courrier_:'] dans $titre, le spam à la
terre entière serait très facile en envoyant ceci dans le POST à la
place de 'formulaire Armorance' :
'Achetez du Viagra<CRLF>
To: <CRLF>
Bcc: <CRLF>
Bcc: <CRLF>
...
Mime-Version: 1.0<CRLF>
... suivi du content-type multipart, du spam en texte et en HTML, et
ainsi de suite ...'
Avatar
Olivier Miakinen
Le 04/08/2008 00:02, docanski a écrit :

Je les ai reçu tous les deux et le champ "to" que tu as complété à
l'insu de mon plein gré dans le second m'interpelle : comment cette
manoeuvre est-elle possible



J'aurais pu le faire avec wget, mais comme j'ai eu la flemme de recopier
tous les champs j'ai simplement fait ceci :

1) Recopier formArmo.html chez moi.

2) Remplacer dans la balise form « action="traitement.php" » par
« action="http://armorance.free.fr/traitement.php" ».

3) Remplacer le champ hidden par un textarea.

4) Dans mon navigateur, afficher http://localhost/.../formArmo.html .

5) Dans le textarea, saisir un titre suivi d'un champ To à la ligne
suivante.

6) Soumettre.


... et comment l'éviter ?



Par exemple en PHP :

switch($_POST['Sujet du courrier :']) {
case 'Formulaire Armorance":
case 'Formulaire Trucmuche':
case 'Formulaire Machinchose':
// Titres prévus dans mes différentes pages
$title = $_POST['Sujet du courrier :'];
break;

default:
// Détournement par un spammeur
die('Va te faire voir, vil spammeur !');
}


Cordialement,
--
Olivier Miakinen
Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
Olivier Miakinen ecrit ce qui suit en ce 04.08.2008 00:01 :

Et le champ « Sujet&nbsp;du&nbsp;courrier&nbsp;: », tu le mets
directement dans le Subject ?



Ce qui laisse supposer que si j'élimine le
<input type="hidden" name="Sujet&nbsp;du&nbsp;courrier&nbsp;:"
value="Formulaire Armorance" />
j'élimine en même temps la cause éventuelle de spam ?

Certains craignaient qu'il faille le changer à terme, mais ça n'était
qu'une crainte non fondée sur l'expérience. Cela dit, si ça t'ennuie
vraiment de devoir changer un texte fixe tous les 24 mois (à la louche),



Ah bon ! je croyais que c'était beaucoup moins que cela !

tu peux prévoir dès le début un texte variable, voire le résultat d'une
opération simple.



Oui mais si le JS n'est pas sécurisant sur ce plan, seul PHP l'est, donc.
Dans ce cas, comment le coder ? (voir la reproduction de mon script de
traitement dans un autre message)
Je sais, j'abuse peut-être un peu ...
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
Olivier Miakinen
Le 04/08/2008 00:23, docanski a écrit :

Et le champ « Sujet&nbsp;du&nbsp;courrier&nbsp;: », tu le mets
directement dans le Subject ?



Ce qui laisse supposer que si j'élimine le
<input type="hidden" name="Sujet&nbsp;du&nbsp;courrier&nbsp;:"
value="Formulaire Armorance" />
j'élimine en même temps la cause éventuelle de spam ?



Oui. Le mieux est de n'avoir que des choses codées en dur dans les
entêtes du message(¹). Un compromis acceptable est de filtrer les sauts
de ligne dans ces champs s'ils viennent de l'extérieur.

(¹) Dans http://fr2.php.net/manual/en/function.mail.php il s'agit des
paramètres $to, $subject et $additional_headers. Le champ $message est
en principe sans danger.

Certains craignaient qu'il faille le changer à terme, mais ça n'était
qu'une crainte non fondée sur l'expérience. Cela dit, si ça t'ennuie
vraiment de devoir changer un texte fixe tous les 24 mois (à la louche),



Ah bon ! je croyais que c'était beaucoup moins que cela !



Je n'ai pas d'expérience moi-même dans ce domaine (pas de formulaire
sur ma page perso), mais il me semble que la personne partageant son
expérience de la chaîne fixe ne recevait strictement aucun spam depuis
des mois.

tu peux prévoir dès le début un texte variable, voire le résultat d'une
opération simple.



Oui mais si le JS n'est pas sécurisant sur ce plan, seul PHP l'est, donc.
Dans ce cas, comment le coder ? (voir la reproduction de mon script de
traitement dans un autre message)
Je sais, j'abuse peut-être un peu ...



Voici un exemple vite fait.

Dans le code PHP générant le formulaire, tu as un tableau (ou une base
de données) contenant quelques mots (ou quelques dizaines, voire
quelques milliers de mots, selon ton degré de paranoïa) :

$mots = array('soleil', 'lune', 'armorance', 'champignon',
'ordinateur', spammeur', ...);

Soit $count le nombre de mots dans le tableau :

$count = count($mots);

Tu veux choisir l'un des mots au hasard :

$rand = mt_rand(0, $count-1);
$mot = $mots[$rand];

Dans le formulaire, tu mets alors un champ hidden contenant le numéro
$rand (mettons que ce soit 2 par exemple), et devant un champ de type
text tu demandes de saisir le mot $mot. Lors du traitement, il te suffit
alors de vérifier que $_POST['mot'] est égal à $mots[$_POST['rand']).

Ça c'est pour un texte simple changeant à chaque coup. Une autre idée
est de faire une opération, mais c'est un peu plus complexe.
Avatar
Olivier Miakinen
Le 04/08/2008 01:02, Olivier Miakinen a écrit :

[...] Une autre idée
est de faire une opération, mais c'est un peu plus complexe.



Tiens, justement voilà un exemple.
http://www.eric-chauzu.fr/index.php?q=ock
http://www.eric-chauzu.fr/index.php?2008/03/09/285-un-skater-a-quatre-pattes
http://www.eric-chauzu.fr/index.php?2008/04/20/288-mario-kart-wii
Avatar
Sergio
Dans son message précédent, Mickaël Wolff a écrit :
Sergio a écrit :

Personnellement, j'ai opté pour une solution toute con : Mettre un time-out
dans le script d'envoi : Si le rédacteur a mis moins de 15s à taper son
message, il est refusé.



C'est sympa pour ceux qui tapent rapidement, ou ceux qui rédigent la
réponse dans un éditeur de texte avant de la copier-coller dans le
formulaire.



Au moins, ça évitent ceux qui tapent en SMS...

--
Serge http://leserged.online.fr/
Mon blog: http://cahierdesergio.free.fr/
Soutenez le libre: http://www.framasoft.org
1 2 3 4 5