Dans ce chapitre 2, après les bases, on passe au concret.
Le langage PHP a été conçu pour pouvoir transmettre des informations de page en page au fil de la navigation d'un visiteur. C'est notamment ce qui permet de retenir son pseudonyme tout au long de sa visite, mais aussi de récupérer et traiter des informations qu'il rentre sur le site, notamment dans des formulaires.
On va commencer à pouvoir communiquer avec ses visiteurs.
Dans cette partie 2, commençons par l'URL
(Uniform Resource Locator), représente une adresse sur el web (du style "http://www.lesite.fr")
En faisant attention à ces adresses dans le navigateur, on verrait certaines assez longues avec des informations après un point d'interrogation du style
"http://www.lesite.fr/search?rlz=1C1GFR343…".
Les informations après le point d'interrogation sont des données que l'on fait transiter d'une page à une autre. On va voir comment cela fonctionne.
Sommaire
Envoyer des paramètres dans l'URL
Former une URL pour envoyer des paramètres
Supposons que notre site s'appelle
monsite.com
et qu'on une page PHP intitulée
bonjour.php
. Pour accéder à cette page, il faut aller sur :
http://www.monsite.com/bonjour.php
On va voir comment
envoyer des informations à la page
bonjour.php
. Pour cela, on va rajouter à la fin de l'URL des informations, comme ceci :
http://www.monsite.com/bonjour.php?nom=Dupont&prenom=Jean
Ce qui est apr&ebgrave;s le point d'interrogation, ce sont des
paramètres que l'on envoie à la page PHP. Celle-ci peut récupérer ces informations dans des variables.
Voici comment on peut découper cette URL :
Le point d'interrogation sépare le nom de la page PHP des paramès. Ensuite, les paramès s'enchaînent selon la forme
nom=valeur
et sont séparés entre eux par le symbole &.
 |
On peut écrire autant de paramètres que l'on veut ? |
En théorie oui. Il suffit de les séparer par des &. On peut avoir :
page.php?param1=valeur1¶m2=valeur2¶m3=valeur3¶m4=valeur4 […]
La seule limite est la longueur de l'url. En général, il n'est pas conseillé de dépasser les 256 caractères.
Créer un lien avec des paramètres
On va créer des liens en HTML d'une page vers une autre qui transmettent des paramètres.
Supposons qu'on a 2 fichiers sur notre site :
- index.php (l'accueil)
- bonjour.php
On veut faire un lien de
index.php
qui amène vers
bonjour.php
et qui lui transmet des informations dans l'URL.
On ouvre
index.php
qui va contenir le lien et insérer ce code :
Code PHP
<a href="bonjour.php?nom=Dupont&prenom=Jean">Dis-moi bonjour !</a>
 |
Le & dans le code a été remplacé par & dans le lien. C'est qu'en HTML & se code & dans le code source (voir entités de caractères HTML). |
Ce lien appelle la page
bonjour.php
et lui envoie 2 paramêtres :
- nom : Dupont
- prenom : Jean
Voyons maintenant comment faire pour que la page
bonjour.php
récupère ces informations.
Récupérer les paramètres en PHP
La page
bonjour.php
qui réceptionne les paramètres va automatiquement créer un array avec un nom spécial :
$_GET.
C'est un array associatif dont les clés correspondent aux noms des paramètres envoyés en URL.
Voyons comment cela fonctionne. On a fait un lien vers bonjour.php?nom=Dupont&prenom=Jean
, ce qui veut dire qu'on a accès aux variables suivantes :
Nom | Valeur |
$_GET['nom'] | Dupont |
$_GET['prenom'] | Jean |
On peut récupérer ces informations, les traiter, les afficher, ce qu'on veut. Voyons comment les afficher.
Créons un nouveau fichier PHP qu'on appelle bonjour.php
avec ce code :
Code PHP
<p>Bonjour <?php
echo $_GET['prenom']; ?>
!</p>
 |
Pour une vraie page web, il faudrait écrire toutes les informations d'en-tête nécessaire en HTML. |
On a donc affiché le prénom qui a été passé dans l'URL. On pourrait afficher nom et prénom :
Code PHP
<p>Bonjour <?php
echo $_GET['prenom'] . ' ' . $_GET['nom']; ?>
!</p>
On a fait une petite concaténation. On affiche le contenu de 2 cases de l'array $_GET.
Ne jamais faire confiance aux données reçues !
Mise en garde contre les dangers qui guette le débutant. On va voir qu'il ne faut JAMAIS faire confiance aux variables qui transitent de page en page, comm $_GET que l'on voit ici.
Le but est de faire peur. Il faut avoir conscience des dangers et des failles de sécurité qu'on peut rencontrer, et qui peuvent mettre en péril le site web !
Cela étant, on va voir pour ne rien risquer.
L'essentiel est d'avoir conscience des problèmes qu'on peut rencontrer en recevant des paramètres de l'utilisateur.
Tous les visiteurs peuvent trafiquer les URL
En testant les codes précédents, on a une URL de la forme :
http://localhost/tests/bonjour.php?nom=Dupont&prenom=Jean
On nous dit bien "
Donc on aurait pu remplacer Jean par Marc :
http://localhost/tests/bonjour.php?nom=Dupont&prenom=Marc
et &ccdeil;a marche !
 |
Et alors quelle importance ? |
Cela montre une chose :
on ne peut pas avoir confiance dans les données qu'on reçoit.
Voyons d'autres types de modifications et voir ce que l'on peut faire pour les éviter.
Tester la présence d'un paramètre
Rien n'empêche au visiteur de supprimer tous les paramètres, par exemple en tentant d'accéder à http://localhost/tests/bonjour.php
Si on teste, on va afficher quelque chose comme :
Code : Console
Bonjour
Notice: Undefined index: prenom in C:\wamp\www\tests\bonjour.php on line 9
Notice: Undefined index: nom in C:\wamp\www\tests\bonjour.php on line 9
!
Que s'est-il passé ? On a essayé d'afficher la valeur de
$_GET['prenom']
et de
$_GET['nom']…
Mais comme on vient de les supprimer de l'URL, ces variables n'ont pas été créées et donc elles n'existent pas ! PHP nous avertit qu'on essaie d'utiliser des variables qui n'existent pas, d'où les "Undefined index".
Pour résoudre ce problème, on peut faire appel à une fonction un peu spéciale :
isset()
. Cette fonction teste si une variable existe. On va s'en servir pour afficher un message spécifique si le nom ou le prénom sont absents.
Code PHP
<?php
if (isset($_GET['prenom']) AND isset($_GET['nom'])) // on a le nom et le prénom
{
echo 'Bonjour' . $_GET['prenom'] . ' ' . $_GET['nom'] . '!';
}
else // Il manque des paramètres, on avertit le visiteur
{
echo 'Il faut renseigner un nom et un prénom !';
}
?>
Que fait ce code ? Il teste si les variables
$_GET['prenom']
et
$_GET['nom']
existent. Si elles existent, on dit bonjour au visiteur. S'il manque une des variables, on affiche un message d'erreur : "Il faut renseigner un nom et un prénom !"
On peut tester.
 |
Est-ce la peine de gérer ça ? |
Oui ! dans ce cas, il n'y a pas d'importance, mais quand le site devient plus complexe, ce manque ou modification d'URL peuvent avoir des conséquences insoupçonnées bien plus grave qu'un simple message d'erreur !
Contrôler la valeur des paramètres
Allons plus loin dans le tripatouillage de l'URL. On va modifier le code source pour gérer un nouveau paramètre : la nombre de fois que le message doit être répété. Les paramètres vont donc être :
bonjour.php?nom=Dupont&prenom=Jean&repeter=8
Le paramètre
repeter
définit le nombre de fois qu'on dit bonjour sur la page. Voici proposition de code :
Code PHP
<?php
if (isset($_GET['prenom']) AND isset($_GET['nom']) AND isset($_GET['repeter']))
{
for ($i = 0 ; $i < $_GET['repeter'] ; $i++)
{
echo 'Bonjour' . $_GET['prenom'] . ' ' . $_GET['nom'] . '!';
}
}
else
{
echo 'Il faut renseigner un nom, un prénom et un nombre de répétition !';
}
?>
On teste si le paramètre
repeter
existe lui aussi (avec
isset($_GET['repeter'])
). Si tous les paramètres sont bien là, on fait une boucle (on a choisi de faire un
for
, mais on aurait pu faire un
while
).
la boucle incrémente une petite variable
$i
pour répéter le message de bienvenue le nombre de fois indiqué.
Si on va sur : http://localhost/tests/bonjour.php?nom=Dupont&prenom=Jean&repeter=8, alors le message s'affichera 8 fois :
Bonjour Jean Dupont !
Bonjour Jean Dupont !
Bonjour Jean Dupont !
Bonjour Jean Dupont !
Bonjour Jean Dupont !
Bonjour Jean Dupont !
Bonjour Jean Dupont !
Bonjour Jean Dupont !
Imaginons le
méchant qui mettrait un nombre très grand, par exemple 19845634875268951
 |
Comment empêcher ça ? |
En étant plus malin, et surtout plus prévoyant. Voici ce qu'il faut anticiper :
- Le cas où le nombre qu'on nous envoie n'est pas une valeur raisonnable.
- Par exemple si on dépasse 100 fois, il faut refuser d'exécuter la page.
- refuser les nombres négatif comme "-4".
- Le cas où la valeur n'est pas logique, ou n'est pas ce qu'on attendait. Rien n'empêche le visiteur de remplacer la valeur du paramètre
repeter
par du texte.
- Si on met n'importe quel mot pour
repeter
ça n'a pas de sens. Il faut un nombre entier positif
- Et si on met "true" ? Cela ne devrait pas être autorisé non plus, on attend un nombre entier positif, pas un booléen
Pour résoudre le problème, on doit :
- Vérifier que
repeter
contient bien un nombre.
- Vérifier ensuite que ce nombre est compris dans un intervalle raisonnable (entre 1 et 100 par exemple).
Pour vérifier que
repeter
contient bien un nombre, une bonne solution pourraît être de forcer la conversion en type entier
(int)
.
On peut pour cela utiliser le
transtypage, une nouvelle notion :
Code PHP
<?php
$_GET['repeter'] = (int) $_GET['repeter'];
?>
Il faut lire cette instruction de droite à gauche. Le
(int)
entre parenthèses est comme un tuyau de conversion. Tout ce qui transite à travers ressort forcément en une valeur de
int
(entier).
Si la valeur est un entier (par exemple 14), elle n'est pas modifiée. En revanche si la valeur contient du texte, elle est transformée en entier et comme ici, PHP ne peut pas lui associer de valeur, il lui donne 0.
Après avoir exécuté cette instruction, la variable
$_GET['repeter']
contient maintenant forcément un nombre entier. Reste plus qu'à vérifier que ce nombre est bien compris entre 1 et 100 à l'aide d'une condition.
Voici le code final sécurisé prévoyant tous les cas pour éviter d'être pris au dépourvu par un visiteur mal intentionné :
Code PHP
<?php
if (isset($_GET['prenom']) AND isset($_GET['nom']) AND isset($_GET['repeter']))
{
// 1 : On force la conversion en nombre entier
$_GET['repeter'] = (int) $_GET['repeter'];
for ($i = 0 ; $i < $_GET['repeter'] ; $i++)
// 2 : Le nombre doit être compris entre 1 et 100
if ($_GET['repeter'] >= 1 AND $_GET['repeter'] < 100)
{
for ($i = 0 ; $i < $_GET['repeter'] ; $i++)
{
echo 'Bonjour' . $_GET['prenom'] . ' ' . $_GET['nom'] . ' !<br />';
}
}
}
else
{
echo 'Il faut renseigner un nom, un prénom et un nombre de répétition !';
}
?>
Cela fait beaucoup de conditions pour quelque chose à la base simple. Mais, c'est nécessaire, il faut prévoir comme ici, les cas tordus :
- Vérifier que tous les paramètres attendus sont bien là.
- Vérifier qu'ils contiennent bien des valeurs correctes comprises dans des intervalles raisonnables.
 |
On n'a pas encore vu tous les risques liés aux données envoyées par l'utilisateur. Nous irons plus loin dans le chapitre suivant et c'est très important ! |