Vous êtes sur la page 1sur 6

Sécurité

Attaquespar injectionSQL:
Menaceset Solutions
Le sitesur lequelvoustravaillezest écriten PHPet utiliseune base
de donnéessousMySQL 4. Cetarticlevouspermetsdétudierdescas
commel'identification
d'utilisation d'unutilisateur, d'unnouvel
lasaisie
d'uncompte.
et la modification
utilisateur

doivent retourner vrai pour pouvoir retourner


Cetarticleexplique: Cequ'il faut savoir: un résultat. C'est là que I'injection SQL inter-
. c o m m e n t e x p l o i t e rc e t t e f a i l l e d a n s u n s i t e I n - . A d m i n i s t r a t i o nd e M y S Q L . v i e n t , s i n o u s s a i s i s s o n s' o r ' a ' : ' a ' d a n s l e
ternet en PHP. . P r o g r a m m a t i o nP H Pe t S Q L . champ login et le champ mot de passe,c'est cet-
. Comment protéger son code source contre ce te requête qui va être exécutée select * from
'or 'at : 'a' and
t y p e d e f a i l l ea i n s iq u e s a b a s ed e d o n n é e s . user where logi-n:'

naqqworr] = l lôr tAt = rat


r'.

Évidement cela marche avec n'importe


I'utilisateur vers le formulaire dans le cas con- quelle condition du moment qu'elle est
traire. Le login saisi est stocké dans la variable vrale :
12
Niveaude difficulté S Posr [ 'login' ] et le mot de passedans Ia varia-
ble s posr [ 'password' ] . Une identification est r ^ - r 1 l - r 1

3
correctesilarequêteselect * from user where tor t1t <'2

'login' password 'or tbt > ta


login: " ' . $ _ P O S T[ ] . "' and
= tor tbt ta
ous allez voir dans une première "'.$ P O S T [ ' p a s s w o r d '] . " ' , ' r e t o u r n e u n e n - <>
tor 'b' 'at 'c
partie des situations non sécuri- registrement. Seul à première vue un login et un between and
'or (1789,1515,1987)#
séespour comprendre le fonction- mot de passe correct permettent de retourner un 1515 in

nement des attaquesde type injection SQL. enregistrement. Les expresstons

Vous allez étudier des requêtesde types se- Comme vous avez pu le constater la requête
lect, insertet update.Ensuite, vous allez ap- l o g i n = " ' . $ _ P O S [T' J . o g i n '] . " ' retourne le premier enregistrement de la table
prendre comm'nt sécuriserle code source qu'elle trouve.
et la base de données pour éviter ce type et Il y a de forte chance pour que ce soit ce-
d'attaque. lui de I'administrateur bien qu'ici ce ne soit
Lesdonnéesdu site que vousallezétudier p a s s w o r d = " ' . $ _ P O S T [ ' p a s s w o r d]' . " ' pas le cas.
sont stockéesdans une table (..,".r) ayant
Tabf eau 1. Liste des enregistrements
une structure similaire à celle ci. Le script
correspondantest dans le Listing l. Vous
devrez au préalablementcréer une basede nCag€ ncage@nprod.com
données nornmée injectionsql(par exemple
avecphpMyAdmin ) et la sélectionneravant
T I
jbiel jBi€l jbielEfree.com jessica
d'exécuterle script qui crée la table aser.
Dans une situation réelleles mots de pas-
se doivent être cryptés. Le profil I corres-
n jbarth jBOrth jbarth@leneuf.com
I
pond au profil de I'administrateurdu site,
le 2 à un profil intermédiaire et le profil 3
NI
à un utilisateur lambda. Tabfeau2.Voicilecontenude la pagesituéà l'adresse

lnjectiondans jmoore@alice.com julianne


jmoore jm00r€
une requêteSELECT
Vous allez utiliser un formulaire HTM, voir
Listing 2 pour s'identifier. Il enverra les don- npajon nP@jon npajon@wanadoo.com paJon
nées saisiesà un script PHB voir Listing 3
pour traiter les données.Il vérifie si le login
II
administrator P@SSwOrd administrator@nprod.com
et le mot de passe sont corrects et redirige
Le # permet de mettre des commentaires se sera I'ensemble de la table qui sera enregis- Cependant, ce cas est extrêmement rare,
dans le SQL tout ce qui le suit n'est pas exé- tré dans le fichierpa ssword. La requête devien- I'utilisation d'un outfile ou d'un dumpfile ne
cuté. En tapant jbarth + dans le login la re- drait : peut se faire que si vous avez les privilèges de
quête devient select * from user where la gestions des fichiers. Le fichier ne doit pas
J - o g i n : ' ; b a r t h ' , '. sel-ect * from user where login=r'or déjà exister.
r r
En combinant les deux méthodes précédentes, 1 - rf into outfil-e 'password.
txt' #; . Ces quelques exemples ne sont pas stati-
S lo n t a p e ' o r ' 1 ' : ' 1 ' a n d n a m e = ' j e s s i c a ' ques. Vous pouvez les adapter, les améliorer
a n d s u r n a m e = ' b i - e l'-# , l a r e q u ê t ed e v i e n t : Il suffit d'aller à l'adresse http://localhost/ o u j u s t e s ' e n i n s p i r e r .
injectionsql/password.txt
pour le consulter. C'est le principe qui compte, ensuite c'est
* L'ensemble des données des utilisateurs
sefect from user where login=rror la connaissance du language SQL qui permet
rfr r1'
_ and name='jessica' and y sont lisibles.Les mots de passen'étant pas de faire ce que I'on veut sur une base de don-
'
surname:'bieI ; cryptésapparaissent en clair. nees.

On se connecte au compte de Jessica Biel.


Listing 1. Script SQL de la base de données
Maintenant que vous savez comment modi
fier une requête, on peut aller plus loin. L'ins- # StrucLure de la tabfe user
truction lilze peut vous permettre de faire des # A créer d a n s l a b a s e d e d o n n é e s < <i n j e c t i o n s q l >>
r e c h e r c h e s L. a s a i s i ed e ' j b a r t h ' and maif C R E A T ET À B L E ' u s e r ' i
l i k e ' %L e n e u f% ' # p e r m e t d e s a v o i r s i I ' u t i l i - 'iduser' inti2] N O TN U L L a u t o j . n c r e m e n t ,
sateur héberge sa messagerieélectronique chez 'logj-n'v a r c h a r t l 2 B ) N O TN U L L d e f a u l t " ,
LeNeuf. Ce clui donnc une requête comme: 'password' varcharil2Br NOTNULL default
",
'nail-' v a r c h a r L1 2 8 i N O T N U I L d e f a u l t ' '
,
select * from user where login='jbarth' ' n a m e ' v a r c h a r 1 2 8) d e f a u l t N U L L ,
i
and mail 1j-ke
'';leneuf
?'; ' s u r n a m e ' v a r c h a r ( L 2 Br d e f a u l t N U L I ,
'profil' j - n t i 1 1 ) N O T N U L L d e f a u l t ' 0 ' , P R I M A R YK E y

Si la connexion à son compte est établie, elle ( 'idUSEr I ) ) TYPE=MYISAM A U T O I N C R E M E N T = ;7


utilise cette messâgeric.
# Contenu de l-a table user
npa'1on' and password like '# r N T o ' u s e r ' V À r , u E S ( 1 , ' n c a g e ' , ' n c a g € ' , ' n c a g e G n p r o d . c o m ' ',n i c o l a s ' ,
TNSERT 'cage',

3);
permet de savoir si lc mot de passe de npajon I N S E R TI N T O ' u s e r ' V A L U E S 2 , ' j m o o r e ' , , j m 0 0 r € ' , , j m o o r e G a l i c e . c o m ' ,' j u l i a n n e ' ,

c ( ) m m e n c ep a r u n n . 'mooret,3,;

T N S E R Tr N T o ' u s e r r v A r , u E S i 3 , ' jbj-e1', ' jBj-€l', 'jbier@free.com', ' jessica', 'bier',


npajon' and password 'n
I i ke ôf' # 3);
TNSERT r N T o ' u s e r ' v A r , u E S i 4 , ' n p a j o n ' , ' n P G j o n ' , ' n p a j o n G w a n a d o o . c o m' 'n, i c o l a s ' ,
permet de savoir si le mot de passecommence 'pajon' 2\;
,
par un n et fini par un/ I N S E R TI N T O r u s e r ' V À J , U E S, 5 , ' ; b a r t h ' , ' j B 0 r t h ' , ' j b a r t h G J - e n e u f . c o m ' ', j e s s i c a ' ,
'barth', 2);

ncage' and password like ' C%' # I N S E R TI N T O ' u s e r ' V A . L U E S i 6 , 'adminj.stratort, 'PG$$w0rd', 'administratorGnprod.com',

NULL, NULL, 1i;


teste si la deuxieme lettre du mot de pas-
se est un C. Le into ourfife et le into Listing 2. Formulaire
d'identifrcation
en html
dumpfile permettent d'extraire des enre- :htmf'

gistrements et les sauvegarder dans un fi-


chier. L'insertion de ce script dans un <head:'

champ de saisiencage' into outf i.l-e ,title'injectionSQL: : . Identification,:/titter


'password. rxr' # créerâ le fichier password r,/head '

contenant à la racine. Il contiendra les infor-


mations de la base concernantle login ncage. <body;

On peut aller plus loin, si on tape , . . h 1 ' .I d e n t l i i c a t i o n , : /h1'

'or '1'='f i n t o o u t f . i l e' p a s s w o r d . t x t ' # <!--Le contenu du fornulaire serd envoyé au script identification.php-->

' form action="identi.fication.php" *"15q6="post"'

Identification Login: - ,i n p u t type="text" name=".1-ogin',t'


,rbr:' Password: input type="password" name="password">,<.br:>
.:input type="submit" value="VaIider":.
' 1/ f o r m >

< r'bodY>

.-.:'htmL.>

Figure 1. lnterfoce d'identifrcation

www.phpsolmag.org
S6curité

Injectiondans
Listing 3. Scriptd'identification en php une requêteINSERT
.: ?php La saisie d'un nouvel utilisateur se fait à tra-

/ / V é r i f i c a t i o n q u e l e s c h a m p ss o n t r e n p l i s vers un formulaire en HTML, voir Listing 4

if t i s s e t ( $ P O S T [ ' I o g i n ' ] )a n d i s s e t ( S - P O S T l ' p a s s w oI r) d) ' i qui envoi les données saisies à un script PHP.

/ / C o n n e c t i o na u s e r v e u r d e b a s e d e d o n n é e s Il les insère dans la base de données et redi-


r r r o o t r r , r r r r ); rige I'utilisateur vers la page d'identification
$connexion = mysql-connect("focalhost",
if ($connexion) i (Listing 5).

// C o n n e c t i o n à f a b a s e d e d o n n é e s < <i n j e c t i o n s q T >> L'analyse de la requête nous montre que


mysql_select_db ( " i n j ect i onsqI ", $ connexion ),' par défaut, un nouvel utilisateur a le profil

// Requete gui ressort 1'enregitrement ayant ce Togin et ce mot de passe numéro 3.

$requete="selecÈ * from user where login='".$_POST"Iogin't and password L'injection SQL doit nous permettre de
""
t
".$ P O S T
I
t P a s s w o r d I' . " t , '
" ; m o d i f i e r c e l a .S i o n t a p e p c r u z Gi t g o l d . c o m ' ,

$ resuf tat= rnysql-query ( $ requete, $connexion ) ; 1) #, dans le dernier champ la requête devien-
$ I igne=mysql_fetch_array ( $resultat ); drait :
// si aucun enregistrement est retourné affichage du formufaire

// d'identification sinon aftichage du forun i n s e r t i n t o u s e r ( 1 o g i n ,p a s s w o r dn


, ame,

if ( $ I i g n e l ' i d u s e r r : = = r r r r )i surnamef mail, profil) values

('pcruz'r'PcruZ'r'PeneloPe'r'cruz',
include lrindex.PhPr ) ;
'pcruzGitgold.com', 1) ;
. else r
include i'Compte.phP' ) ;
Ce qui suit le + n'est pas pris en compte. Pâr
contre si la requête s'était présentée ainsi :

(Qonrroto= rrinqort infô rsêr sêt looin=t"


vr\cYus Lç

$ POST['Login' ] ."', password=r".

en html
Listing 4. Formulaired'inscription $ POST['Password' ] ."', nu*"="'.

.:htmf : $ POST['Name' ] ."', surname:'".

'Surnarne'
..body S POST | I ."' , mail='" .

'Mai]' ." ' ,


h3 Nouvel utili-sateur 'h3:.' $ POST
[ I P r o f i l = 1 #'

<!--Le contenu du fornuLaire sera envoyé au script AddUset.php-->


'.form action="AddUser.php" method="POST" Dans le dernier champ de saisie il aurait fallut
..Ii; Identifiant.:input type="text" n a m e = " L o g i n r ': ' : l i ' marquer:
.:li"Mot de passe.input type="text" name="Password" '' 1i
':li I'NOM
I input type=r'text" n a m e = " N a m e "' : ' l - i ' p c r u z G i t g o l d c. o m ,' p r o f i - L -#1
,tIi: Prénominput type="text" name="Surname":":'Li
..Ii:E-Mail input type="text" n a m e = " M a i - . 1 - ".;1l"-:i > pour initialiser le profil à l. La requête devenait
.:1i .. input type="submit" value="Enregistrer""": 1i
. form: insert j-ntouser set Iogin='pcruz',
- l - ^ - ^ 1 ^ * - |
n e c c u r n r r l = t D a r - - -- n- u L lldlllE-
body I Pslrç!uys ,

r htnl s u r n a m e = ' c r u z ',


mri l = r n yoe r! ut !r vzr çQY iv tf n n l r l v r
cv vnr rm' r t
nrofi l=l
t s !

donsla basede données


Listing 5. Cescriptenregistrelesdonnéessaisies
.: lphp Injectiondans
une requêteUPDATE
// Connexion au serveur MYSQL La modification d'un utilisateur se fait à travers
$connexion = nysql_connect("focalhostt'r "root"r "") ; un formulaire similaire à celui de I'insertion
if t$connexion) r mais affiche en plus les données de I'utilisateur,
voir Listing 6. Une fois modifiées ces données
// Connexion à la base de données << injectionsq) vont être envoyées au Listing 7 qui va modifier
nysgl_select_db ( " in j ection sqI ", $connexion ) ; I'enregistrement correspondant dans la base de
données.
// Insertion d'un nouvef enregistrement dans -la table user Comme pour I'insertion, vous pouvez modi-
// par défaut le profil est le nunéro 3 fier le profil en tapant cette fois ci :
$Requete= "ingert into user (login, paSsword, nane' Surname, mai1, profil) values
rName'. p c r u z G J . t g o l d . c o mp' ,r o f i l = 1 w h e r e
( ' " . $ _ P O S iT' L o g i n ' 1 . " ' , ' " , $ _ P O Si T' P a s s w o r d1' . " ' , ' " , $ - P O S TI ]

" t r ' " . $ - P o s T i ' s u r n a m e 'I . " ' r t " . $ - P O S T [ ' M a i 1] .' " ' , 3);"; i d u s e r = ' ". 9 P O S[T' i d ' ] . " ' #

$resultat= rysql_guery ( $Requete ) ;


dans le dernier champ. On peut modifier le
// Redirection vers la page d'identification profil d'une autre personne dont on connaît le
include (' index.php' ) ; nom et le prénom :

n p a j o n G w a n a d o o . c o mp'r, o f i J - = 1w h e r e
n a m e = r n i c o f a sa' n d s u r n a m s = ' p a j o #
n'

06/2007
rendra I'utilisateur administrateur. La cré-
dibilite des informations laissées par un uti- Listing 6. Formulairede modifrcationd'un utilisateur
lisateur peut être mesurée grâce à son indi- < html)-'

ce de confiance laissé par les visiteurs du si-


te. Rajoutez un champ indice dans la base de <body>

données. <h3>Modification util lsateur<: /h3>

A L T E RT A B L Eu s e r À D Di n d r c e i n t ( 3 ) D E F A U L T <-?php

0 N O TN U L LA F T E Rs u r n a m e ; $connexion = mysql connect ( "1-ocaIhost", "root", "',) ;

if {$connexion)

L'insertion de ce script dans le dernier I

champs incrémentera le score de 54 unités, mysql_select_db ( " in I ect ionsql ", gconnexion ) ;
jbiel@wanadoo.com,
//Recherche de )'enregistrement à nodjfier
indj-ce=indice+54 where name=' jessica' $requete="select * from user where iduser="'.$ POSTi'id,I."';";
and surname='biel-'# $ resul tat= mysql_query ( g requete, $connexion ) ;

$ I igne=rnysql_fetch_array ( $ resu I tat );


Au lieu d'insérerdes morceauxde code dans a'>

les champs de saisierien ne vous empêche


de modifier une url comme celle ci : http:// <!--Le contenu du fornuLajre sera envoyé au script lJpdateuser.php-->
mon site.net/ind ex.phpTp age: membre&,id : 15. ( f orm action= " Upda teUser . php" m e t h o d = " p O S T ' ,- '
Vou s pouvez écri re http //monsite.net/index.p hp7
page:membrekid: I or Login:' administrator'. D e ::iphp

même certains sites utilisent des cookiespour


éviter d'avoir à toujours se reloguer.Eux aussi
peuventêtre modifiés.

Sécuriserla base de donnée


Vous allez commencer par sécuriser au ni-
veau de la base de données. En effet si quel-
qu'un réutilise la basede données pour déve-
lopper une autre application, elle sera déià
sécurisée. Commencezpar créer un utilisateur
userdbisql qui ne pourra qu'accéder à la base
de données injectionSQl. Pour cela dans php
MyAdmin allez dans localhost, privilèges, ajou-
tez un utilisateur :

. Nom utilisateur : userdbisql;


. Serveur: localhost;
. Mot de passe: user; (.1i.,"-input type= t submit' vafue='Modifier' ){i'fi)

< ,,f ormt.,

Décochez tous les privilèges globaux, puis cli- t :'body:

quer sur exécuter.


Dans le cadre Priuilèges spécifiques à une base <rhtml>

de données sélectionnez la base injectionSQl


et cochez les privilèges select,insert et update. Listing 7. Cescriptenregistreen basede donnéeslesmodifrcations
Privilèges spécifiques à une table per- .r ?php

mettent de spécifier des privilèges sur des $connexion = mysql connect("localhost", "root",,"') ;
champs d'une table choisis afin d'empêcher if ($connexion) {
leur lecture, de leur insérer une valeur ou mysql_select_db (" in j ec t ionsql ", $connexion ) ;
leur modification. Dans le code source il va
falloir remplacer ces lignes : //Uodificaùion des chanps d'un enregistrement dont l-'jd est dans le where

9 c o n n e x i o n= m y s q l c o n n e c t $ R e q u e t e =" u p d a t e u s e r s e t l o g i n = ' " . $ _ P O S T i ' L o g i n ' ] . " ' , pâsseJo16[=r".


("1oca1host", "root", ""); par ceJ-1e $ _ P O S T i ' P a s s w o r dI '. " ' , na*"="'.$ P O S T I ' N a m eI '. ' , ' , surname:"'.
ci, = mysql connect("locaJ- j . "',
$connexion i ' S u r n a m e '. . " ' ,
$_POST mail= "' . $_POST
i'Mail' profil=3 where
host", "userdbisgl-", "user" ) ; i d u s e r = " ' . $ P O S |T' i d ' i . " ' ; " i
$resultat= mysql_guery ($Requete);
Afin de ne plus avoir à sbccuperdu profil dans include (' index.php' ) ;
la requête

S R ê d r ê t ê = r r i n < a r j - i n f n r r q a r l l n n i n
\ f v Y r r r a

^.ôôr.'^rd
yoJJwu!ur lldrrrE, rurrrqrLrs, rmr :oi a f I ,

www.phpsolmag.org
5ÉcurltÉ

profil) values ('" .S POST ['Login' ] .


Listlng S.Scriptd'identificationenphp i"
, "'. g P o s r [
'Passiord'] . "' , "'. $

<?Php P O S T [ ' N a m e. "' ]' , ' " . S POSTI


t s u r n a m e t l . t t t ,' u . $
session start O;
POST['Mail']."');";

// vétification que Jes champs sont rernp-lis


if (isset($ P o S T Ir t o g i n ' i ) a n d i s s e È ( $ - P o S T [ ' p a s s w o r d ' ] ) ) Définissezle par défaut à 3. Si le casseprésen-
te, entourez les constantesnumériquesd'apos-
trophes. MySQL les retraduira en numérique
// Vérilication de la validité des champs on protège Les caractères gui pourrait au moment de les inserer dans la base si il y
// nuires au fonctionnenent de Ja regueête a besoin.
if ( !9et_magic_quotes_9pc O)
A L T E R T A B L E u s e r C H A N G Ep r o f i l pro{il INT(1)
{
$ I o g i n = 6 4 6 " l a s h e s ( $ _ P O S T [ 'l o g i n ' ] ) ; DEFAULT3 NOT NULL;

$ p a s s w o r d = a d d s l a s h e s( $ _ P O S T t ' p a s s w o r d ' I ) ;
) MySQL enregistre les utilisateurs du serveur
else dans la table user de la base de données mys-
i ql.Par concéquentil ne faut en aucun donner
$ 1 o g i n = $ _ e o |s'rl o g i n ' l ; I'accèsà cette table voir même à cette baseà un
$password=$_PO
I 'S
PTa s s w o r d I' ; autre utilisateur que root.
) Faitesattention aux droits que vousaccordez
aux utilisateurs les commandesgrant permet
$password= nd5 ($_POSTi'password' I ) ; d'ajouterdesdroits et la commandereuohed'en
$requete="select * from user where login=t".$login."' and passhlord="'. supprimer. Ne donnez pas plus de droit que
S p a s s w o r d ." ' , ' " ; nécessaire.
$resultat= nysql-Erery ( $requete, $connexionl ; Vous ajoutez les droits de lecture, insertion
$ I igne=nrysql_fetch_array ( I resu I tat ) ; et modification pour I'utilisateur userdbisql.
Ces droits s'appliquentseulementà toutes les
if (Sligne['iduser' I=="") tablesde la baseinjeaionsql.
{
include ( ' index. php' 1 ; GRANTSELECT , INSERT , UPDATE
0N 'injectionsql' . *
I
else TO 'userdbisql'G 'Localhost' ,'

{
include (' compte.php' ) ; Cette commande supprime le droit de modi-
S S E S S I O N T ' u s e rI' = $ l i g n e [ ' i d u s e r ' ] , ' fication.

REVOKEUPDATE
)
ON 'injectionsgl' .r
'
'?> F R O M u s e r d b i s q l G' l o c a l h o s t , '
' '

Lfstlng 9. Scriptd'identifrcationenphp La commande sHow cRANTS permet de connai-

<?phP tre lesprivilègesdesutilisateurs.

// Ce script sert a se conrecter au serveur MySQL puis à -la base de données G R À N TF


SHOW SO R ' u s e r d b i s q l ' G ' l o c a l h o s t ' ,
'injectionsq-l '
//
l/ Cfasse de connexion affiche les privilèges de I'utilisateur userdbis-
class Connexion { ql. Dans I'invité de commande DOS tapez
firysql-u root,si la connexion sefait sansqu'un
// r4e.
ùode permettant de se connecter à -la base mot de passevous est demandé tout le mon-
function connexionBase O { de peut se connecter à votre serveur MySQL.
llvariable de connexion à .La base

Shost = "loca1host";
'userdbisql";
Suser =
$passnd = "user'i
556 = "gestion_prets4";
lfCannexian à f{Ysgl

$connexion = mysql-connect ( $host, $user, $Passwd) ;


llCannexion à la àase de donnée concernant le projet

nysql_select_db($bd) or die(',Erreur de connexion à La base de données");

)
l

06/2007
'userdbisql'@'localhost': MD5 étant considérée comme plus rapide
?.'t flflsateur Changcrles prlvllèges
alors que SHAl étant réputée comme plus
globaucr
Privlèges ( TrLit,-ot
ner/ T'-,irt
de,,r i Irer) robuste.
Veuiilozndet qe b6 rnno depiilàgeo uû 4nnâe n eryleio Dans notre script sécurisé (voir Listing 8),
le mot de passe saisie est crypté à I'aide de la
Adminisûaùon fonction md5. S' il est assezlong, et utilise des
! cnnrz I cnrrr chiffres, des majuscules ou encore des carac-
Unevehude0 (zen)enlln le limile
Nd.e:
! urzn I suPrR
! DrDrx û PRocEss
r r oulRM prn coûn0
tères comme € ou @, son cassagedevrait être
! DRoP n nnou prn roun0 très difficile.
E cRnrr rrrPoRlrY Tlllgg ! sEvrDoril !Àt IrPDrrEs
! cnrrrr vrrr I ssoc orruÀsrs f,Àt cc$frcrtolts PEnEom0 On recherche dans la base de données un
I sBorvlrg E LocKTTELES f, r ncERcoaotlcrtcilg0 login et un mot de passe qui correspond à ce-
! cnnrr norrur ! nrrrnnscrs
I urrn nournn I ntpltcrrrcr clrnn lui saisi. Si les données sont trouvées la page
fl rscurr ! RlPLIclrIctf slrw
compte s'affiche et une variable de session
! cRrlrE uslR
est créée sinon on reste sur le formulaire...

f Exéqrdl Utiliserdesvariablesde session


spécifiques
â unebasede données Lorsqu'un utilisateur se connecte, une variable
Brrc dc donnôæ PrMlôgrr "Gnnt' Pdvllôg.rryaclllquc.I unrbDlc Acton de session est définie. Elle permet d'afficher la
injec[onsql srllcr, II{sERr,ItPDÀrENon Non t' S page de compte ou de modification. Sans elle, il
Ajouterdespnvrlèges unevaleur:'
surceftebasede données.Entrez 0 suffirait de connaître l'adresse de la page pour
l'afficheq, de plus l'utilisateur n'est pas obligé
t Exécuttl
de se reconnecter à chaque fois pour changer de
Figure 2.lnterfoce de gestion desprivilègesde l'utilisoteur userdbisql page. On aurait aussi pu utiliser un cookie, afin
de retenir les paramètres de l'utilisateur. Cette
technique est moins flable car vu qu'ils
sont stockés sur l'ordinateur client, ils peuvent
être facilement modifié s. Le cookiespoofing vise
justement à modifier le contenu des cookies
afin de tromper le système sur son identité par
exemple.

Externaliserle script
Vous devez définlr un mot de passe pour vo- Le mysql real escape_string O réalise de connexionà la basede données
tre utilisateur root. l a m ê m e c h o s e q u e l e a d d s t - a s h e sO m a i s d e - Jusqu'à présent vous vous connectiez à la base
mande une connexion à la base de données si- dans chaque script pour mettre en évidence la
Sécuriser I'accèsau serveur non un messâge d'erreur sera retourné. Seuls connexion à la base de données et éviter de ren-
Mettez votre serveur derrière un pare-feu ou les caractères %oet ne seront pas protégés. dre complexe I'architecture du site. Cependant
dans une D}i4Z. MySQL écoute par défaut Si la directive PHP magj-c_quotes_gpc €St il est plus juste de faire un fichier contenant
sur le port 3306. Ilne doit être accessible
que déjà activée et que vous utilisez I'une des deux une classe comme dans le Listing 9 que I'on
par les machinesautorisées.Pour savoirquels fonctions précédentes vos données seront prù appellera qu'une fois et que I'on ne modifiera
ports sont accessiblesvous pouvez scanner tégées par deux fois. La fonction get masic plus. Cela permet d'avoir les paramètres de
votre machine. quotes_gpc O permet de savoir si cette direc- connexion à un seul endroit ce qui facilite les
La commande telnet adr serveur 3306 tive est activée. modifications.
permet de tenter une connexion au serveur Essayez de faire boguer votre application
sur le port désigné. Si une connexion est établie pour corriger les erreurs. Tèstez la taille des Conclusion
c'est que le port est ouvert. variables, des champs. Insérez des caractères Voilà, nous espéronsvous avoir présenté un
spéciaux comme dièses des pourcentages, des tour complet du problème. Encore une fois,
Filtrerlessaisiesde l'utilisateur guillemets ou des apostrophes dans les champs Vous avezdonné que des exemples.Il est tou-
Au niveaudu codesourcefiltrez toutesles ou les URL dynamiques. jours possibled'améliorerla technique.Nous
données saisies par un utilisateur. J'utilise la Dans notre cas, si les données sont valides noussommesservitd'un systèmede gestionde
fonction addslashes o mais il existe aussi on se connecte au serveur et à la base avec basede donnéesMySQL, mais sousOracle ou
mysqJ-_real_escape_string O afin de proté- I'utilisateur que I'on a créé avec des droits Ms SQL celafonctionne aussi.Les sitesInter-
g., dÀ ...*,è.., qr.,i po,rr.rit faire planter restreints. net ne sont pas les seulescibles potentielles.
I'application. Les applications en Java,VB ou C++ peuvent
Le addslashes O retourne une chaîne, Crypter les mots de passe égalementêtre vulnérablessi les champssont
après avoir protégé par un \ tous les caractè- En cas d'infiltration de votre ordinateur, les pas protégés.
res spéciaux, pour être utilisée dans une re- m o t s d e p a s s ec o n s e r v é s e n c l a i r d a n s v o s b a -
quête SQL. sesde données pourront facilement être ré-
Ces caractères sont les guillemets sim- cupérés et utilisés. Pour éviter cela, utilisez DAVIDMICHAUD
ples ('), guillemets doubles ("), anti-sla.sà[\) la fonction PHP MD5 qui permet de crypter L'outeur est étudiant en informotique de gestion.
et NUL (le caractère NULL). Le nom S/za- le mot de passe avant stockage. PHP four- ll est spéciolisé dans le développement d'opplico-
quilLe Rashaun O'Neal deviendra Shaquille nit également la fonction SHAI. Le choix tion informatique. ll crée des boses de données et
Rashaun OVNea/, le \ ne sera pas écrit dans la entre les deux fonctions s'effectuera en lesexploite grâce à des applications lnternet ou ou-
base de données. fonction de la balance rapidité/robustesse. tre qu'ildéveloppe.

www.phpsolmag.org

Vous aimerez peut-être aussi