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

Passage de variable...

9 réponses
Avatar
jde
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 = "mon@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é

9 réponses

Avatar
Olivier Miakinen
Bonjour,

Le 03/03/2011 15:45, jde a écrit :

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

[...]

et un fichier formmail3.php comme ça

<?php
$TO = "";
$h = "From: Fiche contact P+ <> n";
$h .= "Reply-to: $email nn";

$mess = "Nom : $nomn";
$mess .= "Prenom : $prenomn";
$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 = "";
$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: $emailnn";

$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
Avatar
Pascal Poncet
Le 03/03/2011 15:45, jde a écrit :
Bonjour,



Bonjour,

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...

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
Avatar
Mickael Wolff
On 03/03/11 14:45, jde wrote:
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 ;)

$mess = "Nom : $nomn";
$mess .= "Prenom : $prenomn";
$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>

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.
Avatar
Mickael Wolff
On 03/03/11 17:34, Olivier Miakinen wrote:
$email = preg_replace("/[^ -~]/", "?", $email); // ASCII sans CR ni LF



Je préfère filter_var et avorter le script en cas d'erreur :)
Avatar
Olivier Miakinen
Le 03/03/2011 19:38, Mickael Wolff m'a répondu :

$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.

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
Avatar
jde
Il se trouve que Olivier Miakinen a formulé :

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 = "";
$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: $emailnn";

$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é
Avatar
jde
jde avait soumis l'idée :

... 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é
Avatar
Olivier Miakinen
Le 07/03/2011 19:13, jde m'a répondu :

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 ».

Voici une proposition plus sage :

[...]
$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).

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à.

Ai-je mal compris ?



Ai-je été plus clair ? ;-)
Avatar
jde
Olivier Miakinen a formulé la demande :

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é