Discussion:
Passage de variable...
(trop ancien pour répondre)
jde
2011-03-03 14:45:00 UTC
Permalink
Bonjour,

Tout nouveau sur ce forum et en PHP, j'ai un souci de passage de
variables.

dans un fichier html de "contact", j'ai ce bout de code :
<form action="formmail3.php" method="post" style="margin-bottom: 0;">
<table width="350" border="1" cellspacing="2" cellpadding="1">
<tr>
<tr>
<td>Nom</td>
<td><input name="nom" type="text" size="35"></td>
</tr>
<tr>
<td>Prénom</td>
<td><input type="text" name="prenom"></td>
</tr>
<tr>
<td>E-Mail</td>
<td><input type="text" name="email"></td>
</tr>
etc...
<td>
<input type="reset" name="Effacer" id="Effacer" value="Effacer">
<input type="submit" name="Envoyer" id="Envoyer"
value="Envoyer"></td>
</tr>
</table>
</form>

et un fichier formmail3.php comme ça

<?php
$TO = "***@mail.fr";
$h = "From: Fiche contact P+ <> \n";
$h .= "Reply-to: $email \n\n";

$mess = "Nom : $nom\n";
$mess .= "Prenom : $prenom\n";
$sujet = "questionnaire contact";

mail($TO, $sujet, $mess, $h);
?>

Le mail part parfaitement bien, je le reçois correctement, mais aucune
variable de la fiche contact n'est récupérée par le script (enfin...
aucune variable n'est transmise dans le mail).

J'ai loupé un truc, surement, mais lequel ?
(ça se voit que je débute ? ;-) )

Merci d'avance
--
--
rédigé sur un spam 100% recyclé
Olivier Miakinen
2011-03-03 17:34:52 UTC
Permalink
Bonjour,
Post by jde
Tout nouveau sur ce forum et en PHP, j'ai un souci de passage de
variables.
[...]
et un fichier formmail3.php comme ça
<?php
$h = "From: Fiche contact P+ <> \n";
$h .= "Reply-to: $email \n\n";
$mess = "Nom : $nom\n";
$mess .= "Prenom : $prenom\n";
$sujet = "questionnaire contact";
mail($TO, $sujet, $mess, $h);
?>
Ah. J'espère pour toi que tu utilises une version de PHP plus récente
que la 4.2.0 (sortie en 2002 ?) mais tu ne sembles pas avoir lu ceci :
<http://www.php.net/manual/fr/security.globals.php>.

Cela dit, ton script est gravement fautif pour une autre raison : en
passant des données utilisateur sans aucun contrôle dans le quatrième
paramètre de la fonction mail, ton formulaire devient un moyen aisé
offert aux spammeurs pour spammer la terre entière depuis ta page web.
Il en aurait été de même si tu avais passé des données utilisateur dans
le premier ou le second paramètre (mais le troisième est globalement
sans danger).


Voici une proposition plus sage :

<?php
$TO = "***@mail.fr";
$h = "From: Fiche contact P+ <$TO>\n"; // <> seul n'est pas valide

$email = $_REQUEST['email']; // brut de fonderie
$email = preg_replace("/[^ -~]/", "?", $email); // ASCII sans CR ni LF
$h .= "Reply-to: $email\n\n";

$mess = "Nom : $_REQUEST[nom]\n"; // Sans danger ici
$mess .= "Prenom : $_REQUEST[prenom]\n"; // idem
$sujet = "questionnaire contact";

mail($TO, $sujet, $mess, $h);
?>

Cordialement,
--
Olivier Miakinen
Mickael Wolff
2011-03-03 18:38:58 UTC
Permalink
Post by Olivier Miakinen
$email = preg_replace("/[^ -~]/", "?", $email); // ASCII sans CR ni LF
Je préfère filter_var et avorter le script en cas d'erreur :)
Olivier Miakinen
2011-03-04 20:30:00 UTC
Permalink
Post by Mickael Wolff
Post by Olivier Miakinen
$email = preg_replace("/[^ -~]/", "?", $email); // ASCII sans CR ni LF
Je préfère filter_var
Pas bête. Ça me rappelle que je devrais changer ma version de PHP qui
est trop ancienne.
Post by Mickael Wolff
et avorter le script en cas d'erreur :)
Ça c'est une question de goût. Vu que le courriel est envoyé au
webmestre, il peut être intéressant qu'il voie assez vite que
quelqu'un essaye de détourner son formulaire pour spammer.

Cordialement,
--
Olivier Miakinen
jde
2011-03-07 18:13:48 UTC
Permalink
Post by Olivier Miakinen
Cela dit, ton script est gravement fautif pour une autre raison : en
passant des données utilisateur sans aucun contrôle dans le quatrième
paramètre de la fonction mail, ton formulaire devient un moyen aisé
offert aux spammeurs pour spammer la terre entière depuis ta page web.
Il en aurait été de même si tu avais passé des données utilisateur dans
le premier ou le second paramètre (mais le troisième est globalement
sans danger).
<?php
$h = "From: Fiche contact P+ <$TO>\n"; // <> seul n'est pas valide
$email = $_REQUEST['email']; // brut de fonderie
$email = preg_replace("/[^ -~]/", "?", $email); // ASCII sans CR ni LF
$h .= "Reply-to: $email\n\n";
$mess = "Nom : $_REQUEST[nom]\n"; // Sans danger ici
$mess .= "Prenom : $_REQUEST[prenom]\n"; // idem
$sujet = "questionnaire contact";
mail($TO, $sujet, $mess, $h);
?>
Bonjour

Dans ton exemple, tu me proposes bien de passer l'adresse mail de
l'expéditeur dans le quatrième paramètre ($h) avec le Reply-to.

Tu dis pourtant au début de ta réponse que je ne devrais utiliser que
le troisième pour y faire figurer des infos utilisateur.

Ai-je mal compris ?
--
rédigé sur un spam 100% recyclé
Olivier Miakinen
2011-03-07 22:09:33 UTC
Permalink
Post by jde
Post by Olivier Miakinen
Cela dit, ton script est gravement fautif pour une autre raison : en
passant des données utilisateur sans aucun contrôle dans le quatrième
paramètre de la fonction mail [...]
Bien noter : j'ai écrit « sans aucun contrôle ».
Post by jde
Post by Olivier Miakinen
[...]
$email = preg_replace("/[^ -~]/", "?", $email); // ASCII sans CR ni LF
[...]
Dans ton exemple, tu me proposes bien de passer l'adresse mail de
l'expéditeur dans le quatrième paramètre ($h) avec le Reply-to.
Oui. Après s'être assuré (== avoir « contrôlé ») qu'il ne pouvait pas y
avoir de caractère de saut de ligne (CR/LF) dans ces données.

Mickael Wolff était encore plus radical que moi, puisque lui contrôle
avec filter_var qu'il s'agit bien d'une adresse de courriel (ce qui est
plus strict que simplement vérifier qu'il n'y a pas de sauts de ligne),
et en plus qu'il avorte le script en cas d'erreur (alors que je me
contentais de supprimer les caractères vraiment dangereux).
Post by jde
Tu dis pourtant au début de ta réponse que je ne devrais utiliser que
le troisième pour y faire figurer des infos utilisateur.
Plus exactement, je disais que seul le troisième est assez tranquille
pour que mettre dedans des données non contrôlées ne risque pas de
transformer ton formulaire en machine à spammer. Pour bien faire il
faudrait contrôler toutes les données, y compris celles-là.
Post by jde
Ai-je mal compris ?
Ai-je été plus clair ? ;-)
jde
2011-03-08 12:17:46 UTC
Permalink
Post by Olivier Miakinen
Ai-je été plus clair ? ;-)
Tout à fait !
Je te remercie.

"vingt fois sur le métier remettez votre ouvrage". ;-)
--
rédigé sur un spam 100% recyclé
Pascal Poncet
2011-03-03 17:34:52 UTC
Permalink
Post by jde
Bonjour,
Bonjour,
Post by jde
Le mail part parfaitement bien, je le reçois correctement, mais aucune
variable de la fiche contact n'est récupérée par le script (enfin...
aucune variable n'est transmise dans le mail).
Normal...
Post by jde
J'ai loupé un truc, surement, mais lequel ?
Sérieusement, oui.
Tu as dû suivre un exemple très daté, de l'époque où PHP tolérait le
passage de variables directement nommées.
Ce temps-là est révolu depuis que la directive "register_globals" prend
la valeur "Off" dans une installation standard.
Voir : [http://fr.php.net/manual/fr/security.globals.php]

Donc, à la place, il faut utiliser les super-globales $_GET, $_POST ou
$_REQUEST, selon la façon de transmettre les données et le niveau de
sécurité.
Dans ton cas, tu pourras récupérer le nom, par exemple, par la valeur de
$_POST['nom'].
--
Cordialement,
Pascal
Mickael Wolff
2011-03-03 17:34:52 UTC
Permalink
Post by jde
Bonjour,
Tout nouveau sur ce forum et en PHP, j'ai un souci de passage de variables.
Ce sont des paramètres HTTP, pas des variables. Il faut vraiment
faire attention à ne pas confondre les concepts, car sinon tu es foutu ;)
Post by jde
$mess = "Nom : $nom\n";
$mess .= "Prenom : $prenom\n";
$sujet = "questionnaire contact";
mail($TO, $sujet, $mess, $h);
« Tu ne le sais pas encore, mais tu es déjà mort »

Les paramètres HTTP ne sont plus jetés dans la portée globale du
script appelé depuis longtemps. Il faut les récupérer dans les tableaux
super-globaux $_GET et $_POST ou $_REQUEST (mais je fais partie des
trolls qui dénoncent l'usage de $_REQUEST).
<http://ie2.php.net/manual/en/security.globals.php>

Mais pourquoi es-tu déjà mort ? C'est parce que tu utilises des
données en provenance d'une source non-contrôlée (l'extérieur), et que
tu ne traite pas cette entrée.
Je t'invite à chercher sur l'Internet « CSRF », « Captcha » et
consulter cet article qui a l'air bien
<http://www.phpbuilder.com/columns/ian_gilfillan20060412.php3>
Post by jde
J'ai loupé un truc, surement, mais lequel ?
(ça se voit que je débute ? ;-) )
On voit *souvent* des « expérimentés » commettre ces erreurs de
débutant ;) Donc pas de panique, bienvenue au club.
jde
2011-03-07 18:13:48 UTC
Permalink
... j'ai un souci ...
Ah ouuiii !

J'en avais pas qu'un, même... ;-)

Un grand merci aux contributeurs qui m'ont alerté, guidé, expliqué,
aiguillé, mes bévues, et les recettes pour les corriger.

"le chemin est encore long sur la route du PHP..."

Je crois que j'ai de la lecture pour les 10 prochains mois.

J'ai testé l'exemple donné par Olivier, qui évidemment fonctionne
parfaitement.
A moi maintenant de la comprendre (notamment preg_replace et
filter_var), et de l'adapter avant de la mettre en place.


Merci encore !
--
rédigé sur un spam 100% recyclé
Continuer la lecture sur narkive:
Loading...