Protéger l'accès à une page

Protéger l'accès à une page

08 mar | Catégorie: PHP | Rédigé par François | 4894 lectures

En utilisant les notions de classe, et de session nous allons apprendre à authentifier un utilisateur, afin de lui permettre d'accéder à une page protégée.

 

 

Etape 1: Réalisation de la page d'authentification

La première étape va consister à réaliser notre formulaire d'authentification qui se trouvera sur cette page qu'on apellera :"index.php".


Cette page et volontairement simplifiée, j'y ai enlevé les éléments propres à xHTML, etc... On se retrouve donc avec un formulaire assez simple composé de deux champs "login" et "mdp" puis d'un bouton pour soumettre notre formulaire.

Les variables seront transmises avec la méthode post étant donné que faire apparaître un mot de passe en clair dans une URL ne serait pas très sécurisant (voir pas du tout^^).


Etape 2 : La classe Identification

On aurait pu concevoir ce tutorial sans l'utilisation de classe, mais dans une optique pour vous de pouvoir par la suite ajouter quelques fonctionnalités supplémentaires (gestion de compte, etc...) j'ai préférer choisir la programmation objet.

Voici notre classe que l'on nommera Identification et qui se retrouvera dans le fichier "class.Identification.php". Voici l'ossature de cette classe pour que vous puissiez y voir un peu plus clair avant de commencer:


Cette classe va donc posséder 3 méthodes (fonctions): Une qui nous permettra de nous connecter (en fonction de la variable $_POST passée en paramètre), une pour se déconnecter et enfin une dernière pour vérifier si l'on est bien connecté. Vous remarquerez aussi une méthode particulière : le constructeur (__construct) qui est éxécutée automatique dés que l'on instancie un objet de cette classe. Cette méthode ne fait ici rien de particulier si ce n'est démarrer une session qu'on réutilisera par la suite.

Etape 3 : La connexion

Nous allons donc maintenant remplir la méthode connexion (prenant en paramètre la superglobale $_POST). Voici son code:


Cette méthode va donc renvoyer true si l'utilisateur n'a rien rempli ou s'est bien connecté, sinon false si ses identifiants sont incorrects. Dans un premier temps il va falloir tester si le login est vide avec la fonction empty(). S'il ne l'est pas on éxécute le reste de notre fonction.

Ensuite nous nous connectons à une base de donnée pour vérifier le couple login/mdp. Pour cela on effectue une requête de type SELECT avec une condition WHERE ou les 2 paramètres doivent être respectées.

table des utilisateurs

Pour vous connecter à votre base de données, vous avez besoin de vos identifiants. Je les ai donc placé dans un fichier config.php, qui correspond pour moi à ca:


La requête utilise 2 fonctions particulières:

  • mysql_real_escape_string() qui permet de sécuriser votre application en évitant les attaques par Injection SQL.
  • md5() qui crypte le mot de passe en MD5, étant donné que les mots de passes ne sont pas stockés dans la base de données en durs, il est nécessaire de crypter le mot de passe dans notre requête. Par ailleurs si vous utilisez la table montrée un peu plus haut et disponnible dans le code source, le mot de passe correspond à "toto".

Après avoir éxécuté notre requête et vérifié qu'elle nous renvoit bien une seule ligne. Nous initialisons notre variable superglobale de session en précisant aussi l'identifiant du connecté (cela peut être utile de le récupérer après dans les autres pages...). Enfin si tout s'est bien passé, nous redirigeons notre utilisateur vers la page protégée en question.

Etape 4: Et dans l'index.php?

Il ne reste plus qu'à tester cette méthode dans notre page index.php, en n'oubliant pas d'inclure notre classe Identification, on en arrive à ceci:

Voilà tout ce que l'on à faire est d'afficher un message d'erreur si la méthode renvoit false :)

Etape 5 : Protéger les pages

C'est bien gentil tout ça, mais ca n'empêche pour l'instant pas les gens d'accéder à notre page protege.php en y accédant en tapant l'URL. C'est là qu'intervient notre méthode verificationAcces().

Cette méthode est en fait très simple nous testons juste si la variable $_SESSION['connecte'] vaut bien true.

Enfin dans notre page protege.php, il suffit simplement d'instancier la classe Identification et d'éxécuter la méthode verificationAcces() comme ceci:

 

Etape 6: Et moi j'en ai marre, je veux me déconnecter

Il nous manque plus que la méthode deconnexion() à réaliser. Cette méthode est relativement simple, elle utilise 2 fonctions: session_destroy(), qui détruit la session et unset() qui vide et détruit une variable :

Pour éxécuter cette méthode vous l'avez peut être remarqué dans le script précédent, j'utilise une URL qui pointe vers index.php avec une variable de types GET : index.php?deconnexion=true.

Enfin je teste dans ma page si la variable $_GET['deconnexion'] == true auquel cas, il faudra éxécuter notre méthode.

Ce tutorial touche à sa fin, n'hésitez pas à laisser des commentaires, si vous souhaitez quelques éclaircissements ;).

Creative Commons License
Cette création par Snoupix.com est mise à disposition selon les termes de la licence Creative Commons.
Partager ce tutoriel :
wikio scoopeo fuzz diggfr digg-design blogmemes delicious tapemoi yoolink bluegger pioche

17 Commentaires

gravatar
le 09 mars à 17h04 ThibZ Répondre Très bonne idée de commencer avec de la programmation objet, je m'y suis mis un peu plus tôt et je me rend compte au fur et à mesure de sa puissance en PHP.
Merci pour le tuto smile
gravatar
le 23 mars à 19h31 styledrive1 Répondre je suis un debutant dans le web design et la programmation php/mysl
merci pour vos tutos
samir du maroc
gravatar
le 27 mars à 22h26 shafos01 Répondre Bonjour ce tutoriel est super mais j'aimerais qu'il aille uen suite; le formulaire d'inscriptions.svp merci de me répondre a mon email:shafos02@gmail.com
merci
gravatar
le 30 mars à 12h26 nanana Répondre si tu veux mon avis
# if($_GET['deconnexion'] == true){
# $connexion->deconnexion();
# }

c'est codé comme un cochon francois!
il faut tester les valeurs! du coup chez moi ça fait des erreurs et je pleure devant "Notice: Undefined index: deconnexion"
gravatar
le 30 mars à 12h33 nanana Répondre ma solution:

if (isset($_GET['deconnexion'])){
if(($_GET['deconnexion'] == true) ){
$connexion->deconnexion();
}
}

et pis ton $affichage t'as fait du caca aussi (l14 de l'index)
<?php if(isset($affichage)){echo $affichage;}?>
gravatar
le 30 mars à 15h21 Francois Répondre Ah ah c'est bien tenté mais ca marche quand meme!!!
pour le premier ca renvoit faux si la variable il ne la connait pas... ... mais bon c'est vrai que c'est mieux d'écrire comme tu l'as fais...

Pour le 2eme truc <?=?> c'est un raccourci, et pas besoin de isset puisque dans tous les cas ma variable est initialisé.
gravatar
le 30 mars à 15h39 john david Répondre chez moi ca ne marchait pas :
http://www.commentcamarche.net/faq/sujet-1391-php-notice-undefined-index
la notice est reportée selon la configuration du serveur
et le raccourci ne marchait pas non plus, rien ne s'affichait héhé
gravatar
le 10 avril à 16h05 Ryo Répondre Je vois un sacré problème de sécurité dans votre scripts.
Bien que vous stockez les mots de passe en md5 dans la base de donnée, rien n'empêche s'il l'on récupère par un moyen quelconque la base de tenté un brute force en essayant de retrouvé les bons md5 à partir d'une liste dictionnaire ou de site spécialisé dans les tables de conversion md5 <> mot de passe

Une méthode beaucoup plus robuste consiste à créer la clé md5 à partir du mot de passe et d'un grain de sel généré aléatoirement à la création de l'utilisateur. Ce grain de sel devra comporter un bon nombre de caractères (au moins 30). Ensuite on stocke ce grain de sel dans la base et quand on teste si le mot de passe est bon on teste en fait mot de passe + grain de sel. Du coup la clé est md5 est généré sur plus de 30 caractères et l'attaque à partir de dictionnaire ou en brute force devient impossible avec la puissance des ordinateurs actuels.
Exemple :
1) l'utilisateur s'enregistre, il choisit son mot de passe "love"
2) on génère un grain de sel de façon aléatoire d'au moins 30 caractères "un_grain_de_sel_aléatoire_de_bonne_taille"
3) on calcule la clé md5 de "loveun_grain_de_sel_aléatoire_de_bonne_taille"
4) on stock dans la base de donnée la clé md5 et le grain de sel.

Quand l'utilisateur s'identifie:
1) on teste si la clé md5 enregistrée est égal à $mot_de_passe + grain_de_sel_aléatoire_enregistré_pour_cet_utilisateur

Cela permet de caché beaucoup plus fortement les mot de passe si la base de donnée tombe entre de mauvaises mains.
gravatar
le 10 avril à 17h57 François Répondre Ouai je comprends et c'est sur que c'est beaucoup plus sécurisé comme méthode, surtout si le mot de passe choisi est bidon...

Sinon je suis pas très calé niveau hash et cryptage mais sha1 est apparemment un peu plus fiable que MD5...

Merci pour ton gros grain de sel!! Je mettrais à jour ce tuto bientôt!
gravatar
le 27 juin à 22h37 majdi105 Répondre svp je veux un script comme ca
gravatar
le 15 juillet à 18h00 Dilem Répondre @Ryo :

Le fait que les passwords soient hashé en MD5 n'est pas une faille en soit.

Tiens, je te met au défis de retrouver la password d'origine de ce hash :

16b300c7cefa728190d4dd905e6824ae

Bon courage smile

Cependant, SHA-1 est quand même vivement conseillé.

Bon je stop mon troll.
Très bon tuto soit dit au passage.
gravatar
le 16 juillet à 01h14 François Répondre Non non il suffit de mettre un mot de passe intelligent^^

Ah non j'ai pas réussi à décrypter (en tout cas sur les scripts qu'on peut trouver sur le Net...) . Si c'est pas un mot dans le dico c'est tout de suite plus dur^^
gravatar
le 16 juillet à 17h39 Dilem Répondre Et bien disons qu'une suite de 15 char composée de chiffres/lettres/char_spé EST IMPOSSIBLE a trouver avec les dicos actuels.

Donc, cela prouve ce que je voulais dire : La faille ce n'est pas MD, c'est le password en lui même.
Car au final, si l'utilisateur prend comme password 'toto', qu'il soit en MD5/Sha-1/Sha-256/Sha-512 eu autres hash function, il sera quand même dans les dicos smile
gravatar
le 04 janvier à 08h55 doudou1973 Répondre Merci pour cet excellent tuto.
Je suis débutant et j'essaye d'appliquer les conseil que l'on me donne ds mon site de démarrage.

à bientôt dans un autres tuto wink
gravatar
le 17 juillet à 23h24 ZiOu Répondre Bonjour !

D'après ce que je lis plus haut, la méthode donnée via ce tutoriel n'est pas très bonne. A t-il était modifié ? Est-ce quand même correct ?

Merci par avance !
gravatar
le 18 juillet à 12h11 François Répondre Comme il a été dit, le script en soit est assez sécurisé. Après ca dépent du mot de passe utilisé, si tu utilises Azerty, bien sur ca se hack très rapidement. Faut-il encore avoir accès à la Base de donnnées...
gravatar
le 18 juillet à 14h44 ZiOu Répondre Ok !! Merci ! smile

Requête en cours, veuillez patienter...

Ajouter un commentaire