Ce TP correspond concerne la sécurité des sites Web et correspond à la fin de la deuxième partie du cours de PHP. Ce TP s’appuie sur le TP2, les 9 premiers exercices de ce TP doivent donc être finis.

Exercice 1 : Faille SQLi

Cet exercice a pour but de montrer les failles SQli, comment les exploiter et surtout comment les supprimer.

  1. Ajouter dans la classe Model la méthode la méthode suivante :
    public function getNobelPrizesYear($year){
     $requete = $this->bd->prepare("SELECT * from nobels where year = $year");
     $requete->execute();
     return $requete->fetchAll(PDO::FETCH_ASSOC);
    }
    

    Attention : Cette méthode contient une faille SQLi et ne doit pas être utilisée comme modèle pour le développement de méthodes dans la classe Model !

  2. Définir le script year.php. Celui-ci vérifie s’il existe dans l’url un paramètre de nom year. Si c’est le cas, il affiche la liste des prix Nobel de l’année passée dans l’url.

    Remarque : on testera si le paramètre year dans l’url existe mais on ne testera pas sa valeur.

  3. Exploiter la faille SQLi pour supprimer la table nobels !

  4. Recréer la table nobels et corriger la faille SQLi.

Exercice 2 : Faille XSS

Cet exercice a pour but de montrer comment exploiter les failles XSS et surtout comment les supprimer.

  1. Ajouter dans la base de données via le formulaire d’ajout (ou directement en SQL si les exercices 8 et 9 du TP2 ne sont pas finis) le prix Nobel dont le nom est <script>document.location.href="https://fr.wikipedia.org/wiki/Prix_Nobel"</script>, l’année est 2020 et la catégorie est Peace.

  2. Expliquer ce qui se passe lorsque l’on affiche les 25 derniers prix nobels.

  3. Corriger la faille XSS.

Exercice 3 : Accès avec authentification

Le but de cet exercice est de sécuriser l’accès du site Web aux seuls utilisateurs autorisés. On utilisera pour cela une table passwords dans la base de données qui contient les logins et mots de passe chiffrés des utilisateurs autorisés.

Remarque : Pour créer la table passwords, vous pouvez exécuter le script sql/database_passwords.sql. Ce script crée la table passwords avec les colonnes login et password. Elle ajoute aussi trois utilisateurs (login/password): root/admin, alpha/beta et abc/def.

  1. Définir le formulaire connexion.html. Celui-ci doit contenir :
    • un champ de type text pour le login,
    • un champ de type password pour le mot de passe,
    • un bouton de type submit.
  2. Définir la méthode getPassword de la classe Model prenant en paramètre un login et retournant le mot de passe chiffré associé s’il existe dans la table passwords, et false sinon.

  3. Définir le script security.php. Ce script doit être inclus au début de toutes les autres pages du site. Il contiendra le code demandant l’authentification avant de pouvoir accéder au site. La vérification de l’authentification est faite de la manière suivante : si l’utilisateur s’est connecté (saisie d’un login et d’un mot de passe qui correspond à celui associé au login dans la table passwords), alors la variable $_SESSION["connected"] est créée. Lors d’une demande d’une page Web. l’interpréteur PHP vérifie si la variable $_SESSION["connected"] existe. Si c’est le cas, la page est affichée normalement. Autrement, un formulaire de connexion est affiché à la place de la page Web.

    Plus précisément, le script security.php :

    1. active les sessions,
    2. détermine si le formulaire de la question 1 a été soumis ; si c’est le cas, il récupère le mot de passe saisi et le compare avec celui stocké dans la base de données pour le login saisi ; si les deux correspondent, alors il crée la variable $_SESSION["connected"] avec comme valeur le login saisi,
    3. il vérifie si $_SESSION["connected"] existe ; si ce n’est pas le cas, il termine la génération de la page en affichant le formulaire de la question 1.