Page contact en PHP 1/3 - Médecins Maitres

Transcription

Page contact en PHP 1/3 - Médecins Maitres
Modifier cet article (63) Recalculer cette page *
Les Médecins Maîtres-Toile
Accueil
Boite à Outils
Scripts PHP
Page contact en PHP 1/3
Publié le : 18 avril 2006
Publication antérieure :
22 décembre 2003
Imprimer cet article
Auteur :
Alain Sichel †
Page contact en PHP 1/3
1. Page contact classique
Cet article présente un formulaire pour une page contact en PHP. [1] Il s’agit d’une
adaptation de l’article de Jean-Paul Mesters dans ".net" n° 79 novembre 2003 page 75,
dont certaines explications sont reprises ici.
Sommaire
 Explications du code
 Conclusion
L’objectif est de recevoir un message venant d’un formulaire, afin de ne pas laisser traiter son
email à disposition des robots spameurs. Un contrôle du formulaire est inclu, vérifiant que les
champs obligatoires sont biens remplis et que l’adresse email indiquée a une syntaxe correcte.
Cet article a été modifié le 27 janvier 2005 et le 15 octobre 2005 pour éviter une faille de sécurité
permettant le Cross Site Scripting [2].
Cette page peut être testée ici : contact, le code de l’ensemble du script peut être vu et copié
ici : [3].
Explications du code :
<?php
function formulaire($Nom="",$Profession="",$Email="",$Message="") {
?>
La fonction initialise les quatres zones du formulaire, l’accolade ouvrante est suivie du code HTML
du formulaire. La fonction se termine à l’emplacement de l’accolade fermante après la balise de
fermeture du formulaire </form>.
<form action="contact.php" method="post">
Nom : <input type="text" name="Nom" size="30" value="<?php echo
trim(htmlentities($Nom)) ?>" /><br />
Profession : <input type="text" name="Profession" value="<?php echo
trim(htmlentities($Profession)) ?>" size="30" /><br />
E-mail : <input type="text" name="Email" value="<?php echo
trim(htmlentities($Email)) ?>" size="30" /><br />
Message : <textarea name="Message" alt="Message" rows="10" cols="47"
wrap="virtual"><?php echo trim(htmlentities($Message)) ?></textarea><br />
<input type="submit" name="Submit" value="Envoi" alt="Envoi" title="Envoi
de votre message" />
</form>
Lorsqu’on enfonce le bouton submit du formulaire, le contenu les zones est transmis au même
fichier php (ici : "contact.php"). Les minis scripts insérés au niveau de l’attribut value affichent la
donnée introduite dans la zone elle-même. Le code présenté ici est simplifié par rapport au fichier
de démonstration indiqué plus haut, où le formulaire est présenté dans un tableau et avec des
effets de style pour le bouton Envoi.
<?php
}
if(!isset($Nom)) {
formulaire();
}
L’accolade met fin à la fonction PHP. Si la variable $Nom n’existe pas, cela signifie que le
formulaire n’a pas encore été complété. La fonction formulaire() est alors appelée pour l’afficher.
Si la variable $Nom existe, les données sont récupérées dans les variables $vNom,
$vProfession, $vEmail et $vMessage. La fonction trim élimine les éventuels espaces avant et
après la donnée [4] , la fonction htmlentities() évite les failles de sécurité en empêchant le Cross
Site Scripting [2].
else {
$vNom=trim(htmlentities($_POST["Nom"]));
$vProfession=trim(htmlentities($_POST["Profession"]));
$vMessage=trim(htmlentities($_POST["Message"]));
$vEmail=trim(htmlentities($_POST["Email"]));
$destinataire='[email protected]';
$titre="Modèle de page Contact";
$message="Provenance : $HTTP_REFERER\n";
$message.="Adresse IP : $REMOTE_ADDR,\n";
$message.="Navigateur : $HTTP_USER_AGENT\n";
$message.="Nom : $vNom\n";
$message.="Profession : $vProfession\n";
$message.="E-mail : $vEmail\n";
$message.="Message : $vMessage\n";
if (empty($vNom) || empty($Message) || empty($Email)) {
echo "<p class='red'>Vous n'avez pas complété toutes les
zones :</p>";
$erreur=1;
}
A la ligne $destinataire='[email protected]'; il faudra remplacer [email protected] par
votre email pour personnaliser ce script.
Si l’une des zones du formulaire n’a pas été complétée, le message indiqué s’affiche et la variable
$erreur prend la valeur 1. Dans ce cas, la ligne "Vous n’avez pas complété toutes les zones :" sera
affichée (ici en rouge en fonction de la feuille de style de la page). La variable $message prépare
le contenu du message qui sera envoyé par Mail. Les lignes sur "Provenance", "Adresse IP",
"Navigateur" peuvent être sautées si ces informations ne sont pas souhaitées.
if (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-_.]?[0-9a-z])*\\.[az]{2,4}$",$vEmail) && ($erreur<>1)){
echo "<p class='red'>L'adresse e-mail n'est pas correcte :</p>";
$erreur=1;
}
L’adresse e-mail est testée par l’expression régulière ^[0-9a-z] : le premier caractère doit être
une lettre ou un chiffre. ([-_.] ?[0-9a-z])* : il est suivi par un ou plusieurs caractères (lettres ou
chiffres) précédés optionnellement d’un tiret, d’un soulignement ou d’un point. @ : présence du
caratère @. [0-9a-z] : un ou plusieurs caractères (lettres ou chiffres). ([-_.] ?[0-9a-z])* : à
nouveau un ou plusieurs caractères (lettres ou chiffres), précédés ou non de l’un des 3 signes entre
les crochets. \\. : présence d’un point. [a-z]{2,4} : présence de 2, 3 ou 4 lettres. $ : fin de
donnée. Si la syntaxe n’est pas correcte, la phrase "L’adresse e-mail n’est pas correcte :" est
affichée en rouge.
if ($erreur==1) {
formulaire($Nom,$Profession,$Email,$Message);
}
Si l’un des tests précédents est vrai, la variable $erreur aura la valeur 1. Dans ce cas, la
fonction formulaire est à nouveau exécutée pour afficher le formulaire.
else {
mail($destinataire,$titre,$message,"From: $vEmail") ;
echo "<p class='vi4'>Votre message :</p>";
echo "<ul><li>Nom : <span class='red'>" . $vNom . "</span><br />";
echo "<li>Profession : <span class='red'>" . $vProfession.
"</span></li>";
echo "<li>E-mail : <span class='red'>" . $vEmail. "</span></li>";
echo "<li>Message : <span class='red'>" .
$vMessage.'</span></li></ul>';
echo "<p class='vi4'>a bien été envoyé au webmestre du site. Nous
vous remercions.</p>\n" ;
echo "<form name='boutons'><table border='0' cellspacing='0'
cellpadding='0' width='90%' align='center'><tr><td><center>" ;
echo "<input type='button' name='accueil' alt='Accueil'
value=\"Retour à la page d'accueil\" onclick=\"location.href='/index.php'\"
/>\n";
echo "</center></td><td><center><input type='button' name='plan'
alt='Plan du site' value='Vers le plan du
site' onclick=\"location.href='plan.php'\" /></center></td></tr></table>";
}
}
?>
</form>
Si tout est bien rempli, le message est envoyé par la fonction mail() et le visiteur retrouve la
page, cette fois-ci sans le formulaire, mais avec confirmation de l’envoi de son message qui lui est
présenté (ici dans une liste à puces, et avec quelques effets de couleurs avec la feuille de style).
On propose au visiteur de se rendre ailleurs dans le site (ici par deux boutons présentés dans un
tableau, avec des liens vers la page d’accueil et vers le plan du site).
Conclusion
Voilà, tout y est pour une page contact classique, si par contre vous souhaitez des éléments
supplémentaires, c’est abordé dans Page contact en PHP 2/3, et pour éviter le spam, l’ajout d’un
captcha dans Page contact en PHP 3/3.
[1] Evidemment, pour que ce script fonctionne il faut le placer sur une page avec l’extension .php ou
.php3, elle-même mise sur un serveur interprétant le PHP. Cette page a été mise au point pour le site
cyes.info ; la page choix techniques présente aux webmestres les différentes techniques mises en
œuvre pour ce site.
[2] Voir Pourquoi les failles de Cross Site Scripting se ramassent à la pelle et Le Cross Site
Scripting.
Les données récupérées par le formulaire passent par la fonction htmlentities() qui bloque les
attaques en tranformant tout caractère spécial en code HTML. L’ennui, c’est que les caractères accentués
sont eux aussi transformés (é devient &eacute;), ce qui donne des messages peu lisibles. La nouvelle
fonction proposée dans l’article pour le champ "Message" ne bloque que les caractères indésirables, pour
ceux qui utilisent l’ancien script, il suffit de remplacer :
<?php echo trim(htmlentities($Message)) ?>
par :
<?php if (ereg("[]%~#`$&|}{^[><]",$Message)) { echo "Certains caractères
utilisés sont interdits";
$erreur=1; }
else {echo trim($Message); } ?>
[3] Code du script :
< ? p h p
e c h o
< !D O C T Y
< h tm l
" < ? x m l
PE
h tm l
v e r s io n = \ " 1 . 0 \ "
P U B L IC
x m ln s = " h t t p : / / w
w
e n c o d i
" - //W 3 C //D T D
w
.w
X H T
3 .o r g /1 9 9 9 /x h
< h e a d >
< t it le > C o n t a c t < / t it le >
< m e ta
h t t p - e q u iv = " C o n t e n t - t y p e "
< s t y le
ty p e = " te x t/c s s " >
c o n te n t=
< !- b o d y
{
f o n t - f a m ily :
V
e r d a n a ,
b a c k g r o u n d - c o lo r :
f o n t - s iz e :
c o lo r :
m a r g in - le f t :
A
r ia l,
H e lv
# f f f f f f ;
1 1 p x ;
# 0 0 0 0 0 0 ;
1 0 ;
}
p ,
u l,
o l,
td
{
t e x t - a lig n :
ju s t if y ;
}
.r e d
{
c o lo r :
# f f 0 0 0 0 ;
b a c k g r o u n d - c o lo r :
tr a n s p a r e n t;
}
. v i4
{
c o lo r :
# 3 3 0 0 6 6 ;
b a c k g r o u n d - c o lo r :
f o n t- w
e ig h t :
tr a n s p a r e n t;
b o ld ;
}
.to u r
{
b o r d e r :
2 p x
b o r d e r - c o lla p s e :
s o lid
# 3 3 0 0 6 6 ;
s e p a r a te ;
}
. u n it e
{
b a c k g r o u n d - c o lo r :
c o lo r :
# e b e 7 f 1 ;
# 0 0 0 0 0 0 ;
}
//- - >
< / s t y le > < / h e a d >
< b o d y >
< p > C e tte
p a g e
M a ît r e - T o ile
p e r m e t
d u
s it e
l' e n v o i
p o u r
:
d 'u n
m e s s a g
< /p >
< u l>
< li> s ig n a le r
< li> f a ir e
u n e
u n e
e r r e u r
s u r
le
s it e
( lie n
d é
s u g g e s t io n , < / li>
< li> p r o p o s e r
u n
lie n , < / li>
< li> e t c . < / li>
< / u l>
< p > A
t t e n t io n ,
p e r s o n n e l
n o u s
q u i
n e
n e
r é p o n d r o n s
p e u v e n t
p a s
s 'a b o r d e r
a u
q u e
< ? p h p
f u n c t io n
f o r m u la ir e ( $ N o m = " " , $ P r o f e s s io n =
? >
< /p >
< f o r m
a c t io n = " < ? p h p
< t a b le
< tr
b o r d e r = " 0 "
e c h o
$ PH P_ S EL F
c la s s = " t o u r "
? >
c e lls p a c in
c la s s = " u n it e " >
< td
> N o m
< td
w
Pr é n o m
id t h = " 8 0 %
< in p u t
:< /td >
" > < c e n te r >
ty p e = " te x t"
n a m e = " N o m "
s iz e
< /c e n te r > < /td >
< /tr >
< tr
c la s s = " u n it e " >
< t d > P r o f e s s io n
< td
w
id t h = " 8 0 %
< in p u t
:< /td >
" > < c e n te r >
ty p e = " te x t"
n a m e = " P r o f e s s io n
< /c e n te r > < /td >
< /tr >
< tr
c la s s = " u n it e " >
< t d > E - m a il
< td
w
:< /td >
id t h = " 8 0 %
< in p u t
" > < c e n te r >
ty p e = " te x t"
n a m e = " E m a il"
v a lu
< /c e n te r > < /td >
< /tr >
< tr
c la s s = " u n it e " >
< td
v a lig n = " t o p " > M e s s a g e
< td
w
id t h = " 8 0 %
< te x ta r e a
}
t r im ( $ M e s s a g e ) ;
{ e c h o
:< /td >
" > < c e n te r >
n a m e = " M e s s a g e "
$ e r r e u r = 1 ;
e ls e
}
a lt = " M e
? > < /te x ta r e
< /c e n te r > < /td >
< /tr >
< tr
c la s s = " u n it e " >
< td >
< td
< /td >
w
< b r
id t h = " 8 0 %
" >
< c e n te r >
/>
< in p u t
t y p e = " s u b m it "
n a m e = " S u b m it "
< /c e n te r > < /td >
< /tr >
< / t a b le >
< ? p h p
}
if ( !is s e t ( $ N o m ) )
{
f o r m u la ir e ( ) ;
}
e ls e
{
$ v N o m = t r im ( h t m le n t it ie s ( $ _ P O S T
$ v P r o f e s s io n = t r im ( h t m le n t it ie s ( $
$ v M e s s a g e = t r im ( $ _ P O S T [ " M e s s
$ v E m a il= t r im ( h t m le n t it ie s ( $ _ P O S
$ d e s t in a t a ir e = ' s t e t h o @
$ t it r e = " M o d è le
d e
d o m a in e .
p a g e
C o n ta c t"
$ m e s s a g e = " Pr o v e n a n c e
$ m e s s a g e .= " A
d r e s s e
IP
$ m e s s a g e . = " N a v ig a t e u r
$ m e s s a g e .= " N o m
:
if
( e m p ty ( $ v N o m )
e c h o
||
" < p
:
:
:
$ H TTP
$ R EM O
$ H TTP
$ v N o m \n " ;
$ m e s s a g e . = " P r o f e s s io n
$ m e s s a g e . = " E - m a il
:
:
$ v Pr o f
$ v E m a il\ n " ;
$ m e s s a g e .= " M e s s a g e
:
$ v M e s s
e m p ty ( $ M e s s
c la s s = ' r e d ' > V
$ e r r e u r = 1 ;
}
if
( !e r e g i( " ^ [ 0 - 9 a - z ] ( [ - _ . ] ? [ 0 - 9 a - z
e c h o
" < p
c la s s = ' r e d ' > L
$ e r r e u r = 1 ;
}
if
( $ e r r e u r = = 1 )
{
f o r m u la ir e ( $ N o m , $ P r o f
}
e ls e
{
m a il( $ d e s t in a t a ir e , $ t it r
e c h o
" < p
e c h o
" < u l> < li> N o m
c la s s = ' v i4 ' > V
:
< s
e c h o
" < li> P r o f e s s io n
e c h o
" < li> E - m a il
e c h o
:
" < p
" < f o r m
t y p e = 'b u t t o n '
:
< s p a
" < li> M e s s a g e
e c h o
e c h o
:
<
c la s s = ' v i4 ' > a
n a m e = 'b o
e c h o
" < in p u t
e c h o
" < / c e n t e r > < / t d > < t d > < c e n t e r > < in p u t
n a m e = ' a c c u e il
}
}
? >
< /f o r m >
< /b o d y >
< / h t m l>
L’utilisation de <?php echo $PHP_SELF ?> permet de récupérer le nom de la page, sinon il faudrait
indiquer "contact.php" dans notre exemple, et modifier ce nom si la page est renommée.
[4] Avant la version 4.12 de PHP, il faut utiliser $HTTP_POST_VARS à la place de $_POST.
Imprimer cet article
Copyright Médecins Maîtres-Toile francophones
Espace membres - Administration - Crédits