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.
- 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
! -
Définir le script
year.php
. Celui-ci vérifie s’il existe dans l’url un paramètre de nomyear
. 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. -
Exploiter la faille SQLi pour supprimer la table
nobels
! - 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.
-
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 estPeace
. -
Expliquer ce qui se passe lorsque l’on affiche les 25 derniers prix nobels.
-
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.
- 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
.
- un champ de type
-
Définir la méthode
getPassword
de la classeModel
prenant en paramètre un login et retournant le mot de passe chiffré associé s’il existe dans la tablepasswords
, etfalse
sinon. -
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 tablepasswords
), 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
:- active les sessions,
- 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, - 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.