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

Problème de robots

12 réponses
Avatar
Jonat
Salut tout le monde ;-)

J'suis peut-être pas dans le bon NG pour mon problème mais comme je sais
qu'il y a des pro ici ;)

Je possède un très vieux site qui permet de mettre des commentaires sur des
fiches disques et le webmaster a disparu :(
Ca écrit même les commentaires dans des fichiers .txt ! :)

Problème : plein de robots me balancent de la "merdouille" dans ma boîte
mail.
Vous n'auriez pas "un truc" pour limiter un peu ce spammage s'il vous plaît
? (je n'y connais pas grand chose et vu le vieux site j'ai pas trop envie de
payer cher pour faire installer un captcha :)

J'pense que le morceau concerné est celui-ci :

if(isset($_POST["table"]) && isset($_POST["post"])) {
$i=1;
while(file_exists("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt")){ $i++; } $fp =@fopen("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt","w+"); @fwrite($fp, stripslashes($_POST["message"])); @fclose($fp); OpenDB(); $sql = "UPDATE mytracks SET posts=posts+1, post=NOW() "; $sql.= "WHERE track=".$_POST["post"]; $qry = mysql_query($sql); ClosDB(); $headers = "From: $robot\r\n".$header; $subject = "Commentaire sur ".$_POST["table"]." #".$_POST["post"]; $content = stripslashes($_POST["message"]); @mail($mailto, $subject, $content, $headers); header("location:./?".$_POST["table"]."=".$_POST["post"]); exit();}Merci d'avance ;-)

10 réponses

1 2
Avatar
Aurelgadjo
Jonat a écrit :
Salut tout le monde ;-)

J'suis peut-être pas dans le bon NG pour mon problème mais comme je sais
qu'il y a des pro ici ;)

Je possède un très vieux site qui permet de mettre des commentaires sur
des fiches disques et le webmaster a disparu :(
Ca écrit même les commentaires dans des fichiers .txt ! :)

Problème : plein de robots me balancent de la "merdouille" dans ma boîte
mail.
Vous n'auriez pas "un truc" pour limiter un peu ce spammage s'il vous
plaît ? (je n'y connais pas grand chose et vu le vieux site j'ai pas
trop envie de payer cher pour faire installer un captcha :)

J'pense que le morceau concerné est celui-ci :

if(isset($_POST["table"]) && isset($_POST["post"])) {
$i=1;
while(file_exists("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt")){
$i++; } $fp
=@fopen("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt","w+");
@fwrite($fp, stripslashes($_POST["message"])); @fclose($fp); OpenDB();
$sql = "UPDATE mytracks SET posts=posts+1, post=NOW() "; $sql.= "WHERE
track=".$_POST["post"]; $qry = mysql_query($sql); ClosDB(); $headers =
"From: $robotrn".$header; $subject = "Commentaire sur
".$_POST["table"]." #".$_POST["post"]; $content =
stripslashes($_POST["message"]); @mail($mailto, $subject, $content,
$headers); header("location:./?".$_POST["table"]."=".$_POST["post"]);
exit();}Merci d'avance ;-)



Cette "merdouille" contient-elle forcément des URL ?
Si oui, en même pas une ligne on peut refuser tous les messages
contenant http.
Pour mettre un captcha, voir captcha.fr, c'est bien documenté et bien
fait :)
Avatar
Jonat
"Aurelgadjo" a écrit dans le message de groupe de
discussion : 497ddbcc$0$1446$
Jonat a écrit :
Salut tout le monde ;-)

J'suis peut-être pas dans le bon NG pour mon problème mais comme je sais
qu'il y a des pro ici ;)

Je possède un très vieux site qui permet de mettre des commentaires sur
des fiches disques et le webmaster a disparu :(
Ca écrit même les commentaires dans des fichiers .txt ! :)

Problème : plein de robots me balancent de la "merdouille" dans ma boîte
mail.
Vous n'auriez pas "un truc" pour limiter un peu ce spammage s'il vous
plaît ? (je n'y connais pas grand chose et vu le vieux site j'ai pas trop
envie de payer cher pour faire installer un captcha :)

J'pense que le morceau concerné est celui-ci :

if(isset($_POST["table"]) && isset($_POST["post"])) {
$i=1;
while(file_exists("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt")){
$i++; } $fp
=@fopen("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt","w+");
@fwrite($fp, stripslashes($_POST["message"])); @fclose($fp); OpenDB();
$sql = "UPDATE mytracks SET posts=posts+1, post=NOW() "; $sql.= "WHERE
track=".$_POST["post"]; $qry = mysql_query($sql); ClosDB(); $headers =
"From: $robotrn".$header; $subject = "Commentaire sur
".$_POST["table"]." #".$_POST["post"]; $content =
stripslashes($_POST["message"]); @mail($mailto, $subject, $content,
$headers); header("location:./?".$_POST["table"]."=".$_POST["post"]);
exit();}Merci d'avance ;-)



Cette "merdouille" contient-elle forcément des URL ?
Si oui, en même pas une ligne on peut refuser tous les messages contenant
http.
Pour mettre un captcha, voir captcha.fr, c'est bien documenté et bien fait
:)



Oui, y'a des URL à chaque fois.
Si tu sais me dire comment refuser tous les messages contenant http ce
serait sympa ;-)

Jonat.
Avatar
Aurelgadjo
Jonat a écrit :
"Aurelgadjo" a écrit dans le message de groupe de
discussion : 497ddbcc$0$1446$
Jonat a écrit :
Salut tout le monde ;-)

J'suis peut-être pas dans le bon NG pour mon problème mais comme je
sais qu'il y a des pro ici ;)

Je possède un très vieux site qui permet de mettre des commentaires
sur des fiches disques et le webmaster a disparu :(
Ca écrit même les commentaires dans des fichiers .txt ! :)

Problème : plein de robots me balancent de la "merdouille" dans ma
boîte mail.
Vous n'auriez pas "un truc" pour limiter un peu ce spammage s'il vous
plaît ? (je n'y connais pas grand chose et vu le vieux site j'ai pas
trop envie de payer cher pour faire installer un captcha :)

J'pense que le morceau concerné est celui-ci :

if(isset($_POST["table"]) && isset($_POST["post"])) {
$i=1;
while(file_exists("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt")){
$i++; } $fp
=@fopen("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt","w+");
@fwrite($fp, stripslashes($_POST["message"])); @fclose($fp);
OpenDB(); $sql = "UPDATE mytracks SET posts=posts+1, post=NOW() ";
$sql.= "WHERE track=".$_POST["post"]; $qry = mysql_query($sql);
ClosDB(); $headers = "From: $robotrn".$header; $subject =
"Commentaire sur ".$_POST["table"]." #".$_POST["post"]; $content =
stripslashes($_POST["message"]); @mail($mailto, $subject, $content,
$headers); header("location:./?".$_POST["table"]."=".$_POST["post"]);
exit();}Merci d'avance ;-)



Cette "merdouille" contient-elle forcément des URL ?
Si oui, en même pas une ligne on peut refuser tous les messages
contenant http.
Pour mettre un captcha, voir captcha.fr, c'est bien documenté et bien
fait :)



Oui, y'a des URL à chaque fois.
Si tu sais me dire comment refuser tous les messages contenant http ce
serait sympa ;-)

Jonat.



Remplace ta premiére ligne, à savoir
if(isset($_POST["table"]) && isset($_POST["post"])) {
par
le contenu de http://pastebin.com/m991aecc
(collé sur ce site car la mise en forme d'un message dans les newsgroups
peut casser le code)
Si y'a pas d'erreurs ça devrait bloquer tous les messages contenant
"http://". Attention, ça va bloquer de façons silencieuse... càd qu'en
fonction de la suite de ton code, l'utilisateur pourra ne pas etre
averti du non-envoi de son message.
Avatar
Jonat
"Aurelgadjo" a écrit dans le message de groupe de
discussion : 497df69c$0$6827$
Jonat a écrit :
"Aurelgadjo" a écrit dans le message de groupe de
discussion : 497ddbcc$0$1446$
Jonat a écrit :
Salut tout le monde ;-)

J'suis peut-être pas dans le bon NG pour mon problème mais comme je
sais qu'il y a des pro ici ;)

Je possède un très vieux site qui permet de mettre des commentaires sur
des fiches disques et le webmaster a disparu :(
Ca écrit même les commentaires dans des fichiers .txt ! :)

Problème : plein de robots me balancent de la "merdouille" dans ma
boîte mail.
Vous n'auriez pas "un truc" pour limiter un peu ce spammage s'il vous
plaît ? (je n'y connais pas grand chose et vu le vieux site j'ai pas
trop envie de payer cher pour faire installer un captcha :)

J'pense que le morceau concerné est celui-ci :

if(isset($_POST["table"]) && isset($_POST["post"])) {
$i=1;
while(file_exists("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt")){
$i++; } $fp
=@fopen("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt","w+");
@fwrite($fp, stripslashes($_POST["message"])); @fclose($fp); OpenDB();
$sql = "UPDATE mytracks SET posts=posts+1, post=NOW() "; $sql.= "WHERE
track=".$_POST["post"]; $qry = mysql_query($sql); ClosDB(); $headers =
"From: $robotrn".$header; $subject = "Commentaire sur
".$_POST["table"]." #".$_POST["post"]; $content =
stripslashes($_POST["message"]); @mail($mailto, $subject, $content,
$headers); header("location:./?".$_POST["table"]."=".$_POST["post"]);
exit();}Merci d'avance ;-)



Cette "merdouille" contient-elle forcément des URL ?
Si oui, en même pas une ligne on peut refuser tous les messages
contenant http.
Pour mettre un captcha, voir captcha.fr, c'est bien documenté et bien
fait :)



Oui, y'a des URL à chaque fois.
Si tu sais me dire comment refuser tous les messages contenant http ce
serait sympa ;-)

Jonat.



Remplace ta premiére ligne, à savoir
if(isset($_POST["table"]) && isset($_POST["post"])) {
par
le contenu de http://pastebin.com/m991aecc
(collé sur ce site car la mise en forme d'un message dans les newsgroups
peut casser le code)
Si y'a pas d'erreurs ça devrait bloquer tous les messages contenant
"http://". Attention, ça va bloquer de façons silencieuse... càd qu'en
fonction de la suite de ton code, l'utilisateur pourra ne pas etre averti
du non-envoi de son message.



Ca marche ! Merci merci merci !
Quand y'a http:// ça renvoie vers la page d'accueil de mon site.
Ca marquerait http:// interdit ce serait nickel mais ce que tu m'as donné
c'est déjà un énorme service.
Merci beaucoup ;-)
Avatar
Anthony
Jonat a écrit :

J'pense que le morceau concerné est celui-ci :

if(isset($_POST["table"]) && isset($_POST["post"])) {
$i=1;
while(file_exists("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt")){
$i++; } $fp
=@fopen("dat/post/".$_POST["table"]."_".$_POST["post"]."_".$i.".txt","w+");
@fwrite($fp, stripslashes($_POST["message"])); @fclose($fp); OpenDB();
$sql = "UPDATE mytracks SET posts=posts+1, post=NOW() "; $sql.= "WHERE
track=".$_POST["post"]; $qry = mysql_query($sql); ClosDB(); $headers =
"From: $robotrn".$header; $subject = "Commentaire sur
".$_POST["table"]." #".$_POST["post"]; $content =
stripslashes($_POST["message"]); @mail($mailto, $subject, $content,
$headers); header("location:./?".$_POST["table"]."=".$_POST["post"]);
exit();}Merci d'avance ;-)



bonjour,

la prochaine fois, question sur fr.comp.lang.php :-)
ça fera moins HS.

anthony
Avatar
Olivier Miakinen
[ copie et suivi vers fr.comp.lang.php ]

Le 25/01/2009 22:41, Jonat a écrit :
Salut tout le monde ;-)

J'suis peut-être pas dans le bon NG pour mon problème



En effet. Le bon groupe est fr.comp.lang.php, vers où je fais suivre la
discussion. Attention, ce groupe est modéré.

mais comme je sais qu'il y a des pro ici ;)



Ben c'est raté. Le seul qui t'a conseillé sur ton bout de code n'a pas
vu à quel point celui-ci était une aubaine pour les spammeurs, et ne t'a
pas conseillé efficacement sur le moyen d'éviter que ton script spamme
la terre entière.

Je possède un très vieux site qui permet de mettre des commentaires sur des
fiches disques et le webmaster a disparu :(
Ca écrit même les commentaires dans des fichiers .txt ! :)

Problème : plein de robots me balancent de la "merdouille" dans ma boîte
mail.



Problème supplémentaire : ils peuvent balancer la même merdouille à
quelques milliers d'autres destinataires en même temps, sans que tu t'en
rendes compte.

Vous n'auriez pas "un truc" pour limiter un peu ce spammage s'il vous plaît
? (je n'y connais pas grand chose et vu le vieux site j'ai pas trop envie de
payer cher pour faire installer un captcha :)

J'pense que le morceau concerné est celui-ci :



Note : j'ai remis le morceau un peu en forme pour qu'il soit plus
lisible. Sauf erreur de ma part, le code suivant devrait faire la même
chose que celui que tu avais écrit sur une seule ligne.

if(isset($_POST["table"]) && isset($_POST["post"])) {
$i=1;
while(file_exists("dat/post/$_POST[table]_$_POST[post]_$i.txt"))
{ $i++; }
$fp =@fopen("dat/post/$_POST[table]_$_POST[post]_$i.txt","w+");
@fwrite($fp, stripslashes($_POST["message"]));
@fclose($fp);
OpenDB();
$sql = "UPDATE mytracks SET posts=posts+1, post=NOW() ";
$sql.= "WHERE track=$_POST[post]";
$qry = mysql_query($sql);
ClosDB();
$headers = "From: $robotrn$header";
$subject = "Commentaire sur $_POST[table] #$_POST[post]";
$content = stripslashes($_POST["message"]);
@mail($mailto, $subject, $content, $headers);
header("location:./?$_POST[table]=$_POST[post]");
exit();
}



Questions :
1) Que vaut la variable $robot ? Est-ce que ça vient d'un $_POST ?
2) Que vaut la variable $header ? Est-ce que ça vient d'un $_POST ?
3) La variable $mailto vient-elle d'un $_POST ?

Si les trois variables $robot, $header et $mailto sont fixées en dur
dans ton code à des valeurs sans danger, c'est bon. Sinon, il faut faire
quelque chose ici.

Ceci mis à part, le problème le plus évident est celui de $subject que
tu initialises à partir de $_POST["table"] et $_POST["post"]. Si un
attaquant met dedans une valeur avec des sauts de ligne, il peut très
bien rajouter un millier d'entêtes « Bcc » (copie cachée) au courriel
que tu envoies, et donc spammer la terre entière.

Solution : mettre un $subject en dur, et ne mettre $_POST["table"] et
$_POST["post"] que dans $content :
$subject = "Commentaire sur la page web";
$content = "Table : $_POST[table]nPost : $_POST[post]n";
$content .= stripslashes($_POST["message"]);

Cordialement,
--
Olivier Miakinen
Avatar
manu
Olivier Miakinen a écrit :
$content = "Table : $_POST[table]nPost : $_POST[post]n";


Erreur PHP ?
$content = "Table : ".$_POST['table']."nPost : ".$_POST['post']."n";

Car si un jour l'user indique $_POST[un post] -> erreur
Alors que $_POST['un post'] -> OK

Même si $_POST[table] passe, $_POST[table][element] ne passe plus :(
Alors que $_POST['table']['element'] passe.

Emmanuel.
Avatar
Jonat
> Questions :
1) Que vaut la variable $robot ? Est-ce que ça vient d'un $_POST ?
2) Que vaut la variable $header ? Est-ce que ça vient d'un $_POST ?
3) La variable $mailto vient-elle d'un $_POST ?

Si les trois variables $robot, $header et $mailto sont fixées en dur
dans ton code à des valeurs sans danger, c'est bon. Sinon, il faut faire
quelque chose ici.



$mailto = "";
$robot = "";
$header = "X-Sender: $robotrn";
$header.= "X-Mailer: PHPrn";
$header.= "Return-Path: $robotrn";
$header.= "Content-Type: text/plain; charset=iso-8859-1;rn";

Note : je mets @domaine.tld pour éviter que des robots récupèrent la bonne
adresse sur le NG.

Pour les questions "Est-ce que ça vient d'un $_POST ?", je ne comprends pas,
j'suis désolé, la prog c'est vraiment pas mon truc. J'suis juste technicien
de support :)

Ceci mis à part, le problème le plus évident est celui de $subject que
tu initialises à partir de $_POST["table"] et $_POST["post"]. Si un
attaquant met dedans une valeur avec des sauts de ligne, il peut très
bien rajouter un millier d'entêtes « Bcc » (copie cachée) au courriel
que tu envoies, et donc spammer la terre entière.

Solution : mettre un $subject en dur, et ne mettre $_POST["table"] et
$_POST["post"] que dans $content :
$subject = "Commentaire sur la page web";
$content = "Table : $_POST[table]nPost : $_POST[post]n";
$content .= stripslashes($_POST["message"]);



Idem, no comprendo :)

En tout cas merci pour votre aide ;-)
Avatar
Olivier Miakinen
Le 29/01/2009 12:33, manu m'a répondu :

$content = "Table : $_POST[table]nPost : $_POST[post]n";



Erreur PHP ?



Non.

http://fr2.php.net/manual/fr/language.types.string.php#language.types.string.parsing

$content = "Table : ".$_POST['table']."nPost : ".$_POST['post']."n";



C'est une autre façon de l'écrire, moins lisible à mon goût. Cela dit on
peut aussi préférer l'écriture suivante, moins légère que celle que je
proposais mais moins lourde que la concaténation :

$content = "Table : {$_POST['table']}nPost : {$_POST['post']}n";

http://fr2.php.net/manual/fr/language.types.string.php#language.types.string.parsing

Car si un jour l'user indique $_POST[un post] -> erreur



En effet, mais ce n'est pas ce que j'avais écrit.

Alors que $_POST['un post'] -> OK



Quitte à déformer les propos des autres, je peux moi aussi rappeler que
"$_POST['un post']" donne une erreur. Mais ce n'était pas non plus ce
que TU avais écrit.

Même si $_POST[table] passe,



Non. S'il existe une constante nommée « table » et valant autre chose
que "table", le résultat sera différent de celui de $_POST['table'] ou
de "$_POST[table]". Et même dans le cas contraire il s'agit d'une erreur
de type E_NOTICE.

$_POST[table][element] ne passe plus :(



Je ne sais pas si "$_POST[table][element]" passe. À essayer. Cela dit,
dans un tel cas je préfère passer par une variable temporaire :
$elem = $_POST[table][element];
$content = "L'élément en question est $elemn";

Alors que $_POST['table']['element'] passe.



Encore une fois, là n'est pas la question.


Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 29/01/2009 12:33, Jonat a écrit :
Questions :
1) Que vaut la variable $robot ? Est-ce que ça vient d'un $_POST ?
2) Que vaut la variable $header ? Est-ce que ça vient d'un $_POST ?
3) La variable $mailto vient-elle d'un $_POST ?

Si les trois variables $robot, $header et $mailto sont fixées en dur
dans ton code à des valeurs sans danger, c'est bon. Sinon, il faut faire
quelque chose ici.



$mailto = "";
$robot = "";
$header = "X-Sender: $robotrn";
$header.= "X-Mailer: PHPrn";
$header.= "Return-Path: $robotrn";
$header.= "Content-Type: text/plain; charset=iso-8859-1;rn";



Ok, il n'y a aucun trou de sécurité ici. Tu risques juste d'avoir un
problème de lecture des caractères accentués à l'arrivée du fait que les
entêtes MIME sont incomplets (le Content-Type seul ne suffit pas), mais
pour corriger cela il te suffit de rajouter les deux lignes suivantes :
$header.= "MIME-Version: 1.0rn";
$header.= "Content-Transfer-Encoding: 8bitrn";

Note : je mets @domaine.tld pour éviter que des robots récupèrent la bonne
adresse sur le NG.



Oui, tu fais bien. D'ailleurs j'avais tourné ma question concernant
$mailto différemment des autres pour ne pas demander ce qu'elle
contenait, sans penser que $robot était concernée aussi.

Pour les questions "Est-ce que ça vient d'un $_POST ?", je ne comprends pas,
j'suis désolé, la prog c'est vraiment pas mon truc. J'suis juste technicien
de support :)



Tout simplement ceci :
1) $robot = "";
-> C'est en dur, ça ne vient pas d'un $_POST, aucun trou de sécurité
2) $robot = $_POST['robot'];
-> Ça vient d'un $_POST, donc de l'extérieur, donc un attaquant peut
y mettre ce qu'il veut, très gros risque de détournement

Ceci mis à part, le problème le plus évident est celui de $subject que
tu initialises à partir de $_POST["table"] et $_POST["post"]. Si un
attaquant met dedans une valeur avec des sauts de ligne, il peut très
bien rajouter un millier d'entêtes « Bcc » (copie cachée) au courriel
que tu envoies, et donc spammer la terre entière.

Solution : mettre un $subject en dur, et ne mettre $_POST["table"] et
$_POST["post"] que dans $content :
$subject = "Commentaire sur la page web";
$content = "Table : $_POST[table]nPost : $_POST[post]n";
$content .= stripslashes($_POST["message"]);



Idem, no comprendo :)



Eh bien je te propose juste de remplacer dans ton code les deux
instructions qu'il y avait, définissant $subject et $content, par
les trois ligne ci-dessus. Ainsi, les données potentiellement
dangereuses provenant de l'extérieur sont simplement mises dans
le corps du message (où leur potentiel de nuisance est nul) plutôt
que dans les entêtes (où le risque qu'elles servent à spammer la
terre entière est très élevé).

Cordialement,
--
Olivier Miakinen
1 2