• Aucun résultat trouvé

Login/Password : Exemple de Politique de Sécurité

Nous voyons maintenant un exemple d’utilisation d’une session et de cookie un peu mieux sécurisé.

Il s’agit d’un exemple à vocation pédagogique. L’auteur décline toute responsa- bilité en cas d’utilisation, telle quelle ou avec adaptation, de cette politique de sécurité.

This example is to be taken on an ”as is” basis. We accept no liability for conse- quences of direct or indirect use of this security policy whatsoever.

Dans cet exemple,

• Le numéro de session (SID) est aléatoire ;

• On effectue un contrôle par l’adresse IP du client. Cette adresse IP est stockée en session,

et est ensuite testée pour vérifier que le client n’a pas changé d’adresse IP.

Le numéro de session est envoyé chez le client via un cookie. De plus, le cookie (et la session associée) ont une durée de validité de 2mn, temps laissé au client pour charger le script suivant.

Lors du chargement du script suivant, le numéro de session récupéré via le cookie.

Enfin, à chaque chargement de script, on change le SID aléatoire, en copiant les données de session dans une nouvelle, et on re-génère le cookie. Le SID, ainsi que le cookie, n’est ainsi valable qu’une seule fois.

Notons qu’une application sensible pourrait aussi effectuer d’autres contrôles, par exemple sur le navigateur, système d’exploitation, ou encore la cohérence du referer avec la structure du site et de ses liens internes.

La vue d’authentification (saisie de login et du mot de passe) est la suivante : Code Source 7.9 : /sessions/ex07-authentification.php (cf. Fig 7.4)

1 < ?php

2 r e q u i r e _ o n c e ( dirname (__FILE__) . ’ / c l a s s e s / VueHtmlUtils . php ’ ) ;

3 echo CoursPHP\Vue\ VueHtmlUtils : :enTeteHTML5 ( ” Login Form” , ’UTF−8 ’ ,

4 ’ m y S t y l e . c s s ’ ) ;

5 echo ”<h1>Page d ’ A u t h e n t i f i c a t i o n </h1>” ;

6 echo CoursPHP\Vue\ VueHtmlUtils : :getHTML_LoginForm ( ” ex07−receivePassword . php” ) ;

7 echo CoursPHP\Vue\ VueHtmlUtils : :finFichierHTML5 ( ) ;

Figure 7.4 : Illustration du code source 7.9

Le code HTML du formulaire est généré dans la méthode de VueHtmlUtils ci-dessous : Code Source 7.10 : /sessions/classes/VueHtmlUtils.php

27 public s t a t i c function getHTML_LoginForm ( $formAction ) {

28

29 $htmlCode = ” ” ;

30 // Test de co n ne x ion SSL e t l e c a s é ch é ant , warning .

31 i f ( ! i s s e t ($_SERVER[ ’HTTPS ’ ] ) | | $_SERVER[ ’HTTPS ’ ] == ” o f f ” ) {

32 $htmlCode .= ”<p><s t r o n g >Warning :</s t r o n g > Vous n ’ ê t e s pas ”

33 . ” s u r une co nn exio n s é c u r i s é e <i >HTTPS</i > a v e c <i >SSL</i >.” 34 . ”<b r/>Votre c o n f i d e n t i a l i t é n ’ e s t pas g a r a n t i e ! ! !</p>” ;

35 }

36 // Code du f o r m u l a i r e :

37 $htmlCode .= ’<form method=”POST” a c t i o n =” ’ . $formAction . ’”> ’ ;

38 $htmlCode .= ’<i n p u t t y p e =”h i d d e n ” name=” a c t i o n ” v a l u e =” v a l i d a t e A u t h ”/> ’ ; 39 $htmlCode .= ’<p><l a b e l f o r =”e−mail”>e−mail </l a b e l >’

40 . ’<i n p u t t y p e =”e m a i l ” name=”e m a i l ” s i z e =”25”/></p> ’ ; 41 $htmlCode .= ’<p><l a b e l f o r =”motdepasse”>Mot de pa s s e </ l a b e l > ’

42 . ’<i n p u t t y p e =”password ” name=”motdepasse ” s i z e =”25”/></p> ’ ; 43 $htmlCode .= ’<i n p u t c l a s s=”s a n s L a b e l ” v a l u e =”Envoyer ” t y p e =”s u b m i t ”/> ’ ; 44 $htmlCode .= ’</form> ’ ;

45 $htmlCode .= ”<p>L ’ a d r e s s e <i >e−mail </i> d o i t ê t r e v a l i d e e t v o t r e ”

46 . ”mot de p a s s e d o i t c o n t e n i r au moins 8 c a r a c t è r e s , une ” 47 . ” minuscule , une m aj u s cu l e , un c h i f f r e , e t un c a r a c t è r e parmis

48 . htmlentities ( ”#−|.@[]= !&” , ENT_QUOTES, ”UTF−8” )

49 . ” , merci de v o t r e compr é h e n s i o n . . . < / p>” ; 50 return $htmlCode ;

51 }

52 }

Si le mot de passe est trop simple (test dans validationPasswdphp), on appelle une vue d’erreur qui demande un nouveau mot de passe :

Figure 7.5 : Illustration du code source 7.11

Code Source 7.11 : /sessions/ex07-vueErreur.php (cf. Fig 7.5)

1 < ?php

2 r e q u i r e _ o n c e ( ’ c l a s s e s / VueHtmlUtils . php ’ ) ;

3 echo CoursPHP\Vue\ VueHtmlUtils : :enTeteHTML5 ( ”Éc h e c d ’ a u t h e n t i f i c a t i o n ” , ’UTF−8 ’ , ’ my S t y l e . c s s ’ ) ; 4 echo ”<h1>Problème d ’ A u t h e n t i f i c a t i o n </h1>” ; 5 echo ”<p>” ; 6 foreach ( $ d a t a E r r o r a s $errorMsg ) { 7 echo ”<s t r o n g >” . $errorMsg . ”</s t r o n g ><b r/>” ; 8 } 9 echo ”</p>” ;

10 echo CoursPHP\Vue\ VueHtmlUtils : :getHTML_LoginForm ( ” ex07−receivePassword . php” ) ;

11 echo CoursPHP\Vue\ VueHtmlUtils : :finFichierHTML5 ( ) ;

12 ?>

Code Source 7.12 : /sessions/classes/ValidationRequest.php

1 < ?php

2 namespace CoursPHP\Auth ;

3 /* * @ b r i e f V a l i d a t i o n l e s donn é e s de l o g i n / password r e ç ues v i a $_REQUEST. 4 * N e t t o y a g e de t o u t e s l e s cha î nes .

5 * I n i t i a l i s a t i o n à v i d e d e s i n p u t s i n e x i s t a n t s */ 6 c l a s s V a l i d a t i o n R e q u e s t {

7 /* * @ b r i e f N e t t o i e une cha î ne a v e c f i l t e r _ v a r e t FILTER_SANITIZE_STRING

8 */ 9 private s t a t i c function s a n i t i z e S t r i n g ( $ c h a i n e ) { 10 return i s s e t ( $ c h a i n e ) ? f i l t e r _ v a r ( $ c h a i n e , FILTER_SANITIZE_STRING) : ” ” ; 11 } 12 13 /* * @ b r i e f V a l i d a t i o n e t i n i t i a l i s a t i o n d e s donn é e s du l o g i n / password 14 * à p a r t i e r d e s donn é e s r e ç ues dans l e s t a b l e a u s u p e r g l o b a l $_REQUEST.

15 */

16 public s t a t i c function v a l i d a t i o n L o g i n (& $d a t a E rr or , &$email , &$password ) {

17 i f ( ! i s s e t ( $ d a t a E r r o r ) ) {

18 $ d a t a E r r o r = array ( ) ;

19 }

20 // Test s u r l a forme d e s donn é e s de l o g i n e t mot de p a s s e : 21 $wouldBePasswd = $_POST [ ’ motdepasse ’ ] ;

22 i f (empty( $wouldBePasswd ) | | !\CoursPHP\Auth\ A u t h U t i l s : : i s S t r o n g P a s s w o r d ( $wouldBePasswd ) ) { 23 $password = ” ” ; 24 $ d a t a E r r o r [ ” l o g i n ” ] = ”Mot de p a s s e i n c o r r e c t ” 25 . ” v o t r e mot de p a s s e d o i t c o n t e n i r au moins 8 c a r a c t è r e s , ”

26 . ” une minuscule , une m a j u s c u l e , un

c h i f f r e , ”

27 . ” e t un c a r a c t è r e parmis ”

28 . htmlentities ( ”#−|.@[]= !&” , ENT_QUOTES, ”UTF−8” ) . ”</p>” ;

29 } e l s e {

30 $password = $wouldBePasswd ;

31 }

32

33 i f ( f i l t e r _ v a r ($_POST [ ” e m a i l ” ] , FILTER_VALIDATE_EMAIL) == FALSE) {

34 $ e m a i l = ” ” ; 35 $ d a t a E r r o r [ ” l o g i n ” ] = ” Adresse e−mail i n v a l i d e . ” ; 36 } e l s e { 37 $ e m a i l = $_POST [ ” e m a i l ” ] ; 38 } 39 } 40 } 41 ?>

Le test sur la forme du mot de passe, ainsi que la génération du numéro de session (SID) sont effectués par une classe d’utilitaires AuthUtils

Code Source 7.13 : /sessions/classes/AuthUtils.php

1 < ?php

2 namespace CoursPHP\Auth ;

3 /* * @ b r i e f U t i l i t a i r e s de c o n n e c t i o n ( v a l i d a t i o n REGEX du mot de p a s s e ) */ 4 c l a s s A u t h U t i l s {

5 /* * F o n c t io n q u i t e s t e s i un mot de p a s s e e s t s u f f i s e m m e n t d i f f i c i l e

6 * @param $wouldBePasswd mot de p a s s e ( non hash é ) s a i s i par l ’ u t i l i s a t e u r */ 7 public s t a t i c function i s S t r o n g P a s s w o r d ( $wouldBePasswd ) {

8 $ l e n g t h C o n d i t i o n = ( s t r l e n ( $wouldBePasswd ) >= 8 && 9 s t r l e n ( $wouldBePasswd ) <= 3 5 ) ;

10 // On p e u t s û rement f a i r e p l u s e f f i c a c e pour l ’ é v a l u a t i o n d e s 11 // e x p r e s s i o n s r é g u l i è r e s . . .

12 $ C h a r a c t e r D i v e r s i t y C o n d i t i o n = preg_match( ” / [ a−z ]/ ” , $wouldBePasswd )

13 && preg_match( ” / [A−Z]/ ” , $wouldBePasswd )

14 && preg_match( ” /[0−9]/ ” , $wouldBePasswd )

15 && preg_match( ” /[\#\−\|\.\@\[\]\=\ !\&]/ ” , $wouldBePasswd ) ;

16 return $ l e n g t h C o n d i t i o n && $ C h a r a c t e r D i v e r s i t y C o n d i t i o n ;

17 }

18 } 19 ?>

Si tout se passe bien, on crée une session d’ID aléatoire qui contient l’adresse IP du client, pour contrôle par adresse IP lors de la prochaine visite.

Code Source 7.14 : /sessions/ex07-receivePassword.php (cf. Fig 7.6)

1 < ?php

2 r e q u i r e _ o n c e ( dirname (__FILE__) . ’ / c l a s s e s / A u t h U t i l s . php ’ ) ; 3 r e q u i r e _ o n c e ( dirname (__FILE__) . ’ / c l a s s e s / S e s s i o n U t i l s . php ’ ) ; 4 r e q u i r e _ o n c e ( dirname (__FILE__) . ’ / c l a s s e s / V a l i d a t i o n R e q u e s t . php ’ ) ;

Figure 7.6 : Illustration du code source 7.14

5

6 // Fon ction à i m p l é menter : t e s t d ’ e x i s t a n c e du l o g i n /mot de p a s s e en BD 7 // Voir l e c h a p i t r e s u r l e s b a s e s de donn é e s . . .

8 function use rPasswordCheckInDatabase ( $email , $hashedPassword ) {

9 // TODO : t e s t e r s i l e c o u p l e e−mail e t mot de passe ( après hashage SHA512) 10 // s o n t b i e n pr é s e n t s dans l a b a s e de donn é e s

11 return true ;

12 }

13 // Test de l a forme ( r e g e x ) du mot de p a s s e e t de l ’ e−mail

14 \CoursPHP\Auth\ V a l i d a t i o n R e q u e s t : : v a l i d a t i o n L o g i n ( $ d ata E r r or , $email , $password ) ;

15

16 i f (empty( $ d a t a E r r o r ) ) { // l e s donn é e s d ’ a u t h e n t i f i c a t i o n ont l a bonne forme . 17 // On v é r i f i e que l e mot de p a s s e ( a p r è s h a s h a g e SHA512)

18 // e s t b i e n c e l u i en b a s e de donn é e .

19 i f ( ! use rPasswordCheckInDatabase ( $email , hash ( ” sha512 ” , $password ) ) ) {

20 // Renvoi d ’ une e r r e u r de l o g i n 21 $ d a t a E r r o r [ ” l o g i n ” ] = ” Erreur : l o g i n ou mot de p a s s e i n c o r r e c t ” ; 22 } e l s e { 23 \CoursPHP\Auth\ S e s s i o n U t i l s : : c r e a t e S e s s i o n ( $ e m a i l ) ; 24 // F l u s h d e s Donné e s de S e s s i o n , ( s a u v e g a r d e simmé d i a t e ur l e d i s q u e ) 25 session_write_close ( ) ; 26 } 27 } 28 // Appel de l a vue : 29 i f (empty( $ d a t a E r r o r ) ) {

30 require ( ’ ex07−vueNormale . php ’ ) ;

31 } e l s e { // Appel de l a vue d ’ e r r e u r : 32 require ( ’ ex07−vueErreur . php ’ ) ;

33 }

34 ?>

Code Source 7.15 : /sessions/ex07-vueNormale.php

1 < ?php

2 r e q u i r e _ o n c e ( ’ c l a s s e s / VueHtmlUtils . php ’ ) ;

3 echo CoursPHP\Vue\ VueHtmlUtils : :enTeteHTML5 ( ”Welcome Page ” , ’UTF−8 ’ ,

4 ’ m y S t y l e . c s s ’ ) ;

5 echo ”<h1>P e r s i s t a n c e de connexion<b r/>Exemple de p o l i t i q u e de s é c u r i t é</h1>” ;

6 echo ” Bienvenue ! Vous ê t e s c o n v e n a b l e m e n t a u t h e n t i f i é.< b r/>” ;

8 . ”<a h r e f =\”./ ex08−sessionTestIP −RandomIdCookie . php\”> c l i q u e z i c i </a>.” ;

9 echo \CoursPHP\Vue\ VueHtmlUtils : :finFichierHTML5 ( ) ;

10 ?>

La création de la session (avec son ID), contenant l’e-mail et l’adresse IP du client est effectuée par une classe utilitaire SessionUtils :

Code Source 7.16 : /sessions/classes/SessionUtils.php

1 < ?php

2 namespace CoursPHP\Auth ;

3 /* * @ b r i e f Gère l e c y c l e de v i e de l a s e s s i o n ( I d e n t i f i c a t i o n u t i l i s a t e u r ) 4 * g é nère d e s SID a l é a t o i r e s , c r é e e t met à j o u r l e c o o k i e pour l e SID */ 5 c l a s s S e s s i o n U t i l s { 6 /* * Duré e du c o o k i e en s e c o n d e s */ 7 c o n s t DUREE_COOKIE = 120 ; 8 9 /* * @ b r i e f f o n c t i o n de g éné r a t i o n de l ’ ID de s e s s i o n a l é a t o i r e */ 10 public s t a t i c function g e n e r a t e S e s s i o n I d ( ) {

11 // Géné r a t i o n de 10 o c t e t s ( pseudo−) a l é a t o i r e s cod é s en hexa 12 $ c r y p t o S t r o n g = f a l s e ; // V a r i a b l e pour p a s s a g e par r é f é r e n c e 13 $ o c t e t s = openssl_random_pseudo_bytes ( 1 0 , $ c r y p t o S t r o n g ) ; 14 $mySid = bin2hex ( $ o c t e t s ) ; 15 return $mySid ; 16 } 17

18 /* * Cré a t i o n d ’ une s e s s i o n de SID a l é a t o i r e a v e c l ’ e−mail ( l o g i n unique )

19 * @param $ e m a i l e−mail se r v a n t de l o g i n ( i d e n t i f i a n t unique de l ’ u t i l i s a t e u r )

20 * @param $ r o l e r ô l e de l ’ u t i l i s t e u r ( admin , v i s i t e u r , g e s t i o n n a i r e . . . ) 21 * ( v o i r l e c h a p i t r e s u r l e Front C o n t r o l l e r ) * */

22 public s t a t i c function c r e a t e S e s s i o n ( $email , $ r o l e=” v i s i t o r ” ) {

23 // Dans l e c a s i m p r o b a b l e d ’ une c o l l i s i o n s u r l e SID ,

24 // Mais s u r t o u t d ’ une u s u r p a t i o n d ’ i d e n t i t é , on d é t r u i t l a s e s s i o n 25 // a v a n t de r e d é marer une s e s s i o n v i d e 26 session_write_close ( ) ; 27 session_start ( ) ; 28 session_destroy ( ) ; 29 // Le numé ro de s e s s i o n a l é a t o i r e 30 $mySid = s e l f : : g e n e r a t e S e s s i o n I d ( ) ; 31 session_id ( $mySid ) ; 32 // D e s t r u c t i o n du c o o c k i e a v a n t de l e r e c r é e r 33 setcookie ( ” s e s s i o n−id ” , ”” , time ( ) −60, ’ / ’ ) ;

34 // Cré a t i o n du c o o k i e a v e c SID a l é a t o i r e . V a l i d i t é du c o o k i e : 2mn 35 // Un p i r a t e aura b e s o i n de temps pour v o l e r l e c o o k i e . . .

36 setcookie ( ” s e s s i o n−id ” , $mySid , time ( )+s e l f : :DUREE_COOKIE, ’ / ’ ) ;

37 // Dé marrage de l a s e s s i o n 38 session_start ( ) ;

39 // On é chappe , même s i on s a i t qu ’ on a v a l i d é l ’ a d r e s s e e−mail . . . . 40 $_SESSION [ ’ e m a i l ’ ] = htmlentities ( $email , ENT_QUOTES, ”UTF−8” ) ;

41 // On é chappe , même s i on s a i t qu ’ on a v a l i d é l ’ a d r e s s e e−mail . . . . 42 $_SESSION [ ’ r o l e ’ ] = htmlentities ( $ r o l e , ENT_QUOTES, ”UTF−8” ) ;

43 $_SESSION [ ’ i p A d d r e s s ’ ] = $_SERVER[ ’REMOTE_ADDR’ ] ; 44 session_write_close ( ) ;

45 }

46 } 47 ?>

Lorsque l’utilisateur poursuit la navigation, il reste reconnu et peut accéder à ses données personnelles. Dans notre implémentation, pour plus de sécurité, le numéro de session est à usage unique. Une nouvelle session, avec son nouveau SID est créée à chaque chargement de script.

Figure 7.7 : Illustration du code source 7.17

Code Source 7.17 : /sessions/ex08-sessionTestIP-RandomIdCookie.php (cf. Fig 7.7)

1 < ?php

2 r e q u i r e _ o n c e ( dirname (__FILE__) . ’ / c l a s s e s / A u t h U t i l s . php ’ ) ; 3 r e q u i r e _ o n c e ( dirname (__FILE__) . ’ / c l a s s e s / S e s s i o n U t i l s . php ’ ) ; 4

5 $ d a t a E r r o r = array ( ) ;

6 // Test pour v o i r s i l ’ i d e n t i f i a n t de s e s s i o n e x i s t e e t s i l a donn é e a l a bonne forme

7 // (10 c h i f f r e s hexa e n t r e 0 e t f ) 8 i f ( ! i s s e t ($_COOKIE[ ’ s e s s i o n−id ’ ] ) | |

9 !preg_match( ” /^[0−9a−fA−F]{20} $/” , $_COOKIE[ ’ session −id ’ ] ) ) {

10 $ d a t a E r r o r [ ’ no−cookie ’ ] = ” Votre cookie a peut−ê t r e e x p i r ée , ”

11 . ” Merci de vous c o n n e c t e r à nouveau . . . ” ;

12 } e l s e {

13 // On r é c u p è r e l ’ ID de s e s s i o n 14 $mySid = $_COOKIE[ ’ s e s s i o n−id ’ ] ;

15

16 // On r é c u p è r e l e s donn é e s de s e s s i o n : 17 session_id ( $mySid ) ;

18 session_start ( ) ;

19

20 // Test s u r l e s donn é e s de s e s s i o n e t c o n t r ô l e par IP

21 i f (empty($_SESSION [ ’ e m a i l ’ ] ) | | empty($_SESSION [ ’ i p A d d r e s s ’ ] )

22 | | $_SESSION [ ’ i p A d d r e s s ’ ] != $_SERVER[ ’REMOTE_ADDR’ ] ) { 23 $ d a t a E r r o r [ ”no−s e s s i o n ” ] = ” Votre s e s s i o n a peut−ê t r e e x p i r ée , ”

24 . ” Merci de vous c o n n e c t e r à nouveau . . . ” ;

25 session_destroy ( ) ;

26 } e l s e {

28 // l a s e s s i o n dans une n o u v e l l e . On r e g é nè re e n s u i t e l e c o o k i e

29 // Comme ça , l e c o o k i e n ’ e s t v a l a b l e qu ’ une f o i s , e t l ’ ID de s e s s i o n a u s s i 30 // ce q u i l i m i t e beaucoup l a p o s s i b i l i t é d ’ un é v e n t u e l h a c k e r 31 $backupSession_Email = $_SESSION [ ’ e m a i l ’ ] ; 32 // On d é t r u i t l ’ a n c i e n n e s e s s i o n 33 session_destroy ( ) ; 34 // On r e c r é e une s e s s i o n : 35 CoursPHP\Auth\ S e s s i o n U t i l s : : c r e a t e S e s s i o n ( $backupSession_Email ) ; 36 // F l u s h d e s Donné e s de S e s s i o n , ( s a u v e g a r d e simmé d i a t e ur l e d i s q u e ) 37 session_write_close ( ) ; 38 } 39 } 40 // Code de l a vue :

41 i f (empty( $ d a t a E r r o r ) ) { // Code de l a vue normale 42 require ( ’ ex08−vueNormale . php ’ ) ;

43 } e l s e { // Appel de l a vue d ’ e r r e u r : 44 require ( ’ ex07−vueErreur . php ’ ) ;

45 }

46 ?>

Code Source 7.18 : /sessions/ex08-vueNormale.php

1 < ?php

2 r e q u i r e _ o n c e ( ’ c l a s s e s / VueHtmlUtils . php ’ ) ;

3 echo CoursPHP\Vue\ VueHtmlUtils : :enTeteHTML5 ( ” C o n s u l t a t i o n d e s Donné e s

P e r s o n n e l l e s ” , ’UTF−8 ’ , ’ myStyle . c s s ’ ) ;

4 echo ”<h1>C o n s u l t a t i o n d e s Donné e s P e r s o n n e l l e s </h1>” ;

5 echo ”<p>” ;

6 echo ”Ne l e d i t e à p e r s on n e : l e <i >SID</i > e s t : <b r/>” . $mySid ;

7 echo ”</p><p>” ;

8 echo ” Votre a d r e s s e e−mail e s t : ” . $_SESSION [ ’ email ’ ] . ”<br/>” ;

9 echo ”Grâ ce à v o t r e a d r e s s e e−mail , l e serveur peur r e t r o u v e r vos donné es p e r s o n n e l l e s <b r/>” ;

10 echo ” e t vous l e s a f f i c h e r . Et d ’ a i l l e u r s , l e s v o i c i . . . < b r/>” ;

11 echo ” Pour acc é d e r e n c o r e à d e s donn é e s s e n s i b l e s , ”

12 . ”<a h r e f =\”./ ex08−sessionTestIP −RandomIdCookie . php\”> c l i q u e z i c i </a>.” ; 13 echo ”</p>” ;

14 echo CoursPHP\Vue\ VueHtmlUtils : :finFichierHTML5 ( ) ;

Figure 7.8 : Re-chargement du script. La connexion persiste, mais le SID a changé.

Bases de Données et PHP Data

Objects

8.1 Créer un Base de Données dans phpmyadmin

8.1.1 Création d’une Base de Données Relationnelle

(a) Création d’une nouvelle Base de Données (b) Création d’une nouvelle table

Figure 8.1 : Processus de Création d’une Base de Données et des Tables

Figure 8.3 : Vue Relationnelle de base de données avec trois tables. La définition des clés étrangères doit être cohérente avec les clés primaire.

8.1.2 Créer un Utilisateur MySql Responsable d’une BD

Pour éviter qu’un éventuel piratage de la configuration de l’authentification pour l’accès aux bases de données, qui se trouve en clair dans les sources PHP, ne donnée accès à toutes les bases de données, nous pratiquons des droits ”étanches” entre nos différentes bases de données. Dans notre cas, l’utilisateur remy aura les droits uniquement sur la base ExampleDataBase.

(a) Ajout d’un Utilisateur MySQL (b) Accès MySQL Uniquement sur le Serveur Local

(a) Privilèges Spécifiques d’un Utilisateur sur une Base (b) L’Utilisateur aura tous les droits sur une Base

Figure 8.5 : Donner tous les Droits à l’Utilisateur sur une Base spécifique