Discussion:
Probleme de robots
(trop ancien pour répondre)
Olivier Miakinen
2009-01-29 00:23:37 UTC
Permalink
[ copie et suivi vers fr.comp.lang.php ]
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 :)
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++; }
@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();
}
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
manu
2009-01-29 11:33:57 UTC
Permalink
Post by Olivier Miakinen
$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.
Olivier Miakinen
2009-01-29 14:29:53 UTC
Permalink
Post by manu
Post by Olivier Miakinen
$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
Post by manu
$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
Post by manu
Car si un jour l'user indique $_POST[un post] -> erreur
En effet, mais ce n'est pas ce que j'avais écrit.
Post by manu
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.
Post by manu
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 by manu
$_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 $elem\n";
Post by manu
Alors que $_POST['table']['element'] passe.
Encore une fois, là n'est pas la question.


Cordialement,
--
Olivier Miakinen
Jonat
2009-01-29 11:33:57 UTC
Permalink
Post by Olivier Miakinen
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 = "***@domaine.tld";
$robot = "***@domaine.tld";
$header = "X-Sender: $robot\r\n";
$header.= "X-Mailer: PHP\r\n";
$header.= "Return-Path: $robot\r\n";
$header.= "Content-Type: text/plain; charset=iso-8859-1;\r\n";

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 :)
Post by Olivier Miakinen
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
$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 ;-)
Olivier Miakinen
2009-01-29 14:29:53 UTC
Permalink
Post by Jonat
Post by Olivier Miakinen
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.
$header = "X-Sender: $robot\r\n";
$header.= "X-Mailer: PHP\r\n";
$header.= "Return-Path: $robot\r\n";
$header.= "Content-Type: text/plain; charset=iso-8859-1;\r\n";
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.0\r\n";
$header.= "Content-Transfer-Encoding: 8bit\r\n";
Post by Jonat
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.
Post by Jonat
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 = "***@domaine.tld";
-> 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
Post by Jonat
Post by Olivier Miakinen
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
$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
Jonat
2009-01-29 21:47:11 UTC
Permalink
Autre question.
Dans le mail ça m'affiche le numéro de la fiche ($_POST["post"])
Est-il possible d'afficher le titre du disque lié à ce numéro de fiche ?
Le titre se trouve dans la base de données jonat dans
jonattracks/track/numerodefiche/titre (si vous voyez ce que je veux dire :)
Dans numerodefiche on retrouve plein d'informations genre le titre,
l'artiste, l'année de sortie, etc.

Merci d'avance ;-)

Loading...