TD2-2

Dans ce TD, nous allons travailler avec PHP et un serveur web qui nous permettra de faire la "paserelle" entre les données HTTP et PHP.

Installation

Utiliser un serveur

Avant de commencer, vous pouvez installer un serveur sur une machine personelle. Sous Debian/Ubuntu, vous pouvez installer les paquets apache2 et libapache2-mod-php7.

Sous Windows, il est préférable d'utiliser un outil tel que WAMP, que vous pourrez trouver sur le site wampserver.com.

Serveur intégré

Une autre option beaucoup plus élégante et pratique est d'utiliser le serveur web intégré à PHP, pour cela, placez vous dans le dossier que vous souhaitez et tapez:

$ php -S 127.0.0.1:8080

Un serveur web se lancera alors en écoutant sur le port 8080, vous pourrez donc vous connecter à la page http://127.0.0.1:8080/ et vous accéderez à votre application web.

Sous Windows, vous pouvez utiliser le script php-server.bat, placez le dans le dossier des sources et exécutez le.

Exercice 1 : Les commodités de PHP

Comme vu en dans le chapitre HTTP, les variables GET sont passées en paramètre d'une page comme ceci:

http://www.domain.com/path/to/resource.php?a=1337&b=42

Ces variables peuvent être récupérées à l'aide du tableau $_GET.

1. Factorisation

Examniez le code fournit dans le dossier exercice1/, il est constitué de plusieurs pages HTML, ce qui est problématique, car le code des en-têtes contenant le style et le menu est à chaque fois recopié! A l'aide de PHP, créez une unique page web qui contiendra toutes ces pages.

Dans un premier temps, utilisez les variables GET pour que le contenu de la page soit modifié en fonction du paramètre passé dans l'URL, tout en gardant une seule page PHP.

Rajouter des pages à ce site pourrait devenir pénible, car la page principale PHP que vous avez créé va grossir et grossir. Proposez une autre manière de factoriser le code entre les pages.

Exercice 2 : Les formulaires

Les formulaires représentent une très grande partie du développement d'un site web.

1. Compréhension

Lisez et testez le script exercice2/form.php de l'archive.

A) Comment est detecté le fait que le formulaire a été posté ?

B) A quoi correspond ce test vis à vis du protocole HTTP ?

C) Pourquoi la fonction htmlspecialchars() est utilisée ici ?

2. Ajout d'un champ

Ajoutez un champ nom au formulaire. Lorsque le formulaire est soumis, si les deux champs sont remplis, la page devra indiquer: "Vous vous nommez [Prénom] [Nom]".

3. Un peu de validation

Ajoutez maintenant un champ email. N'oubliez surtout pas comment fonctionne le protocole HTTP, même en utilisant le type de champ HTML5 email, le client pourra toujours transmettre des données arbitraires via une requête POST. C'est pour cela qu'il faut impérativement vérifier coté serveur que l'adresse fournie est bien formée, vous pourrez utiliser la fonction PHP filter_var().

4. Menu déroulant

Ajoutez un champs "Genre" sous forme de menu déroulant (Homme, Femme). Le genre sera affiché dans le message après traitement.

5. Cases à cocher

Ajoutez des cases à cocher permettant à l'utilisateur de séléctionner les langages de programmation qu'il connaît. Par exemple:

Les langages seront affichés dans le message après traitement.

Si vous utilisez languages[] dans l'attribut name des cases à cocher, vous obtiendrez un tableau, bien plus pratique que de créer une case avec un nom différent par langage!

6. Pré-remplissage

Si l'utilisateur veut modifier ses choix (par exemple si il a fait une erreur, ou que le serveur déclenche une erreur de validation parce que son e-mail n'est pas correct etc.), constatez que le formulaire redevient vide après un envoi.

Faites en sorte qu'il soit re-rempli avec les choix de l'utilisateur.

Exercice 3 : Sécurisation

Le dossier exercice3/ contient une page web dont l'accès devrait être sécurisé. En effet, les pages marquées du cadenas dans le menu ne devraient pas être accessibles sans être identifié au préalable.

A l'aide d'un formulaire et des sessions PHP, sécurisez l'accès à la page pour que les utilisateurs présents dans le fichier users.php puissent s'idientifier avec leurs mots de passe. Pour inclure users.php, vous pourrez utiliser la notation:

<?php

// Notation spéciale dans le cas ou le fichier 
// inclus contient un "return"
$users = include('users.php');

Une tentative d'accès à une page sans être identifié provoquera l'affichage d'un message d'erreur.

Implémentez ensuite une fonction de déconnexion.

Au lieu d'afficher un message d'erreur lorsque l'utilisateur tente d'accéder à une page sans être identifié, redirigez le vers le formulaire d'identification, et souvenez vous de quelle page il venait.

De cette manière, si il s'identifie, il sera redirigé vers la page qu'il essayait de consulter.

Indication: vous pouvez réaliser une implémentation générique à l'aide du contenu de $_SERVER

Exercice 4 : Captcha

Le but de cet exercice est d'implémenter un CAPTCHA, ou code visuel que l'utilisateur doit recopier pour confirmer qu'il n'est pas un robot.

Le code qui permet de générer l'image vous est déja fourni à titre d'exemple dans le dossier exercice4.

1. Mise en place

Créer un formulaire (non fonctionnel) comportant un champ texte et l'image générée,
proposant ainsi à l'utilisateur de la recopier pour confirmer qu'il n'est pas un robot.

2. Phrases aléatoire

Faites en sorte que le code soit généré aléatoirement

3. Validation

Ecrivez maintenant le code qui confirme si le teste a été oui ou non passé avec succès. Lorsque le formulaire est soumis, il faut vérifier coté serveur que le code qui a été entré par l'utilisateur est bien celui qui a été préalablement affiché sur son image.

Exercice 5 : Le retour des sessions

Reprenez le code de l'exercice 3 et modifiez le pour ne PAS utiliser session_start() ni $_SESSION, en réimplémentant votre propre système de session.

Quelques fonctions utiles:

// Lire et écrire dans un fichier
file_put_contents($file, $data); // Ecrire
$data = file_get_contents($file); // Lire
// Tester si un fichier $file existe
if (file_exists($file)) {
}
// Générer un identifiant aléatoire
$id = uniqid();
// Transformer un objet en chaîne de caractères
$data = serialize($something);

// Transformer une chaîne de caractère en un objet
$something = unserialize($data);
// Définir un cookie 'key' à '123' qui expirera quand le
// navigateur sera fermé
setcookie('key', '123', 0);