Vous êtes sur la page 1sur 56

5/2009

1
2 10/2010
www.phpsolmag.org 3
Table des matires
4
TABLE DES MATIRES
10/2010
4 10/2010
Le priodique phpsolutions est publi par
Software Press Sp. z o.o. SK
Bokserska 1, 02-682 Varsovie, Pologne
Tl. 0975180358, Fax. +48 22 244 24 59
www.phpsolmag.org
Prsident de Software Press Sp. z o.o. SK :
Pawe Marciniak
Directrice de la publication :
Ewa ozowicka
Dpt lgal :
parution
ISSN : 1731-4593
Rdacteur en chef :
ukasz Bartoszewicz
Couverture :
S awomir Sobczyk
DTP :
S awomir Sobczyk Studio2W@gmail.com
Composition :
S awomir Sobczyk
Correction :
Valrie Viel, Thierry Borel, Barbara Bourdelles
Bta-testeurs :
Brice Favre, Valrie Viel, Cyril David,
Christophe Milhau, Alain Ribault, Stphane Guedon,
Eric Boulet, Mickael Puyfages, Christian Hernoux,
Isabelle Lupi, Antoine Beluze, Timote Neullas,
Yann Faure, Adrien Mogenet, Jean-Franois Montgaillard,
Turmeau Nicolas, Jonathan Marois, Wilfried Ceron,
Wajih Letaief, Franois Van de Weerdt, Eric Vincent,
Franck Michal Assi, Francis Hulin-Hubard,
Nicolas Dumas, David Michaud.
Les personnes intresses par la coopration
sont pries de nous contacter :
editor@phpsolmag.org
Publicit :
publicite@software.com.pl
Pour crer les diagrammes on a utilis le programme
AVERTISSEMENT
Les techniques prsentes dans les articles
ne peuvent tre utilises quau sein des rseaux
internes. La rdaction du magazine nest pas
responsable de lutilisation incorrecte des techniques
prsentes. Lutilisation des techniques prsentes peut
provoquer la perte des donnes !
VARIA
6 Actualits
Actualits du monde du dveloppement.
Christophe Villeneuve
PROJETS
8 Solution de stockage base sur ZFS
et Ubuntu
Olivier Olejniczak
La virtualisation de PC a amen de nouveaux besoins.
Alors que la concentration de serveurs fonctionnels vir-
tualiss par serveur physique de virtualisation saccrot,
la demande en termes de capacit de stockage et de
fiabilit des quipements saccrot galement. Dans
cet article vous verrez comment mettre en uvre une
solution de stockage de trs large capacit et scuri-
se accessible en NFS ou ISCSI depuis le rseau local
(exemple : serveur de virtualisation).
DOSSIER
20 AJAX et PHP
Jean Tatareau
Laugmentation des dbits Internet et de la diversit
dapplications sur PC mais aussi de diffrents termi-
naux, mobiles, tablettes, assurent la prsence incon-
tournable dAJAX. Dans cet article, nous apprendrons
pourquoi et comment est n le concept Ajax, son utili-
sation avec PHP. Nous aborderons les avantages de la
communication asynchrone et ses limites, les solutions
apportes et sa mise en uvre.
PRATIQUE
34 Crer son propre hbergement
Alexandre Bazzet
Nous verrons dans cet article comment crer un serveur
dhbergement web avec un minimum de scurit. Dans
une premire partie nous installerons/configurerons un
AMP (Apache + MySQL + PHP), puis nous installerons
des logiciels tiers
pour les serveurs
FTP, DNS, etc.
Table des matires Table des matires
SCURIT
49 Introduction la scurit web
Nicolas Turmeau
Un dveloppeur quel quil soit peut raliser de grands
projets. Mais quelle chute fait-il lorsque le dit projet
vient dtre dtruit par une attaque ? De trs haut,
tellement haut que certains en abandonnent tout es-
poir. Dans cet article nous tudierons les bonnes pra-
tiques les plus simples avoir pour viter au maxi-
mum cette situation.
POUR LES DBUTANTS
39 SQL : langage de dfinition des donnes
Cilia Mauro, Magali Contensin
De nombreuses applications Web (forums, galeries
dimages, sites marchands, ) reposent sur des bases
de donnes. Linteraction avec la base de donnes, la
cration de la base et des tables, la manipulation des
donnes, ainsi que le contrle des droits daccs aux
donnes sont raliss avec le langage SQL. Les bases
de donnes sont trs utilises dans les applications
Web. La cration, linterrogation et la manipulation des
donnes de la base sont ralises en SQL. Dans cette
srie darticles vous apprendrez le langage SQL ain-
si que les bases ncessaires pour communiquer avec
une base de donnes partir dun script PHP.
6
Actualits
10/2010
OpenTBS 1.4
OpenTBS est un outil PHP qui vous per-
met de gnrer des chiers OpenO ce
et Ms O ce partir de modles que pro-
posent ces logiciels. Il sappuie sur le mo-
teur TinyButStrong et utilise la librairie
zLib. Les documents gnrs peuvent
tre produits sous forme dun chier
enregistr sur le serveur, dun tlchar-
gement direct, ou mme dun chane
binaire si besoin.
http://www.tinybutstrong.com/fr/
eZ Publish 4.4
La nouvelle version du CMS eZ Publish
est disponible. Elle apporte de nom-
breuses nouveauts comme lamliora-
tion de linterface dadministration pour
faciliter la gestion de contenu, lvolu-
tion de la partie dition des images avec
la possibilit de modier directement le
contenu, le soutien du format HTML 5,
des volutions du cot de lutilisateur...
Par ailleurs, eZ Systems cratrice du CMS
eZ Publish invite la communaut par-
ticiper au dveloppement de celui-ci.
Cest--dire la compagnie ouvre le pro-
cessus de dveloppement de son coeur.
http://ez.no
LAFUP fdre la communaut PHP
Le rendez-vous du moment concerne
le Forum PHP, qui se droulera le 9 et 10
novembre 2010. Pour cet vnement
lAFUP runit de nombreux acteurs PHP
(Rasmus Lerdof, Zeev Suraski , Derrick
Rethans, et Ilia Alshanetsky...), SQL avec
la prsence des crateurs de SkySQL
(Kaj Arn, Michael Monty Widenius).
Et propose aussi un espace Projets PHP
et beaucoup dautres chose dcouvrir
http://www.afup.org/forumphp.
Magix CMS
Magix CMS passe sous licence Open
Source, tout en gardant les fonction-
nalits premires du CMS : bas sur le
rfrencement. Cette version propose
plus de fonctionnalits de base avec
une interface plus simplie.
http://www.cms-php.be
Speed test mini PHP
Il sagit dune application multi-lan-
gage et qui a t libre pour vous
permettre de tester votre bande pas-
sante. Celle-ci fonctionne avec dif-
rents langages et peut tre installe
sur votre propre serveur sous la forme
dun nouveau service supplmentaire.
http://www.speedtest.net/mini.php
SabreDAV 1.3.0
SabreDAV vous permet dajouter facile-
ment WebDAV une application PHP.
En dployant WebDAV (ou SabreDAV
prcisment) vous pouvez utiliser votre
application web comme sil sagissait
dun systme de chiers pour les utili-
sateurs. Cette nouvelle version apporte
une volution du cache et de la classe.
http://code.google.com/p/sabredav/
SkySQL Ab, lalternative MySQL
Oracle
En ce mois doctobre, les yeux se sont penchs sur le secteur des bases
de donnes et principalement MySQL. SkySQL Ab est la nouvelle socit
dont le but principal est de sengager dans lOpen Source. Elle est fonde
et finance par 100% danciens cadres et investisseurs de MySQL, et est
en train de devenir le nouveau centre de lcosystme MySQL. Loffre de
SkySQL Ab repose sur une alternative de logiciels, services et assistance
pour la base de donnes MySQL, cest dire :
MySQL Server, est une offre alternative parfaitement able, scurise
et conomique pour les utilisateurs de solutions de base de donnes
propritaires. Le serveur MySQL peut tre utilis pour toutes les appli-
cations de base de donnes en production.
Maria DB Server, est une alternative compatible MySQL, qui peut aus-
si intgralement remplacer le serveur de base de donnes MySQL. En
plus, de nouveaux drivers apparaissent pour tre utiliss avec Zend
Framework, Drupal...
SkySQL Entreprise Monitor, est un administrateur de base de donnes
MySQL dans une bote.
SkySQL Visual Editor, est un diteur de requte SQL et permet aux
administrateurs de base de donnes de dployer plus rapidement et ef-
cacement leurs serveurs de base de donnes MySQL.
L'assistance technique SkySQL permet aux clients de maximiser la dis-
ponibilit et la performance de leurs applications de base de donnes.
SkySQL offre la fois une assistance de rsolution des problmes (er-
reurs gnrales, coupures de service et usage gnral) et une assis-
tance consultative (pour aider lamlioration dun dploiement spci-
que).
Enfin, Kaj Arn, co-fondateur de SkySQL Ab et Monty Widenius, crateur
de MySQL et fondateur de Monty Program Ab, seront prsents en exclusi-
vit mondiale au Forum PHP 2010
http://www.skysql.com/
Rdaction des actualits :
Christophe Villeneuve
7
<<TOP>>
www.phpsolmag.org
<<BODY>>
<<SHORT_NEWS>>
9/2010 2
Extension ZIP pour PHP
10/2010 8
Projets
L
es solutions professionnelles de virtualisation pro-
posent des options de haute disponibilit entre
serveurs de virtualisation mais, la condition que,
les disques durs des machines virtuelles soient stocks
dans un espace accessible tous les serveurs de votre
ferme de virtualisation. Cet espace de stockage partag
doit tre suffisamment volumineux pour pouvoir hber-
ger lintgralit des disques durs de toutes les machines
virtuelles. Il doit pouvoir accrotre sa capacit de stocka-
ge ds lapparition de nouveaux besoins. Cet espace
doit tre extrmement fiable car, en cas de panne, cest
cette fois lintgralit des machines de tous les serveurs
de virtualisation qui seront en panne. Les performances
de cet espace de stockage devront tre suffisantes pour
assumer les demandes en I/O de tous les serveurs vir-
tualiss. La mise en uvre de la baie doit videmment
tre conomique afin de ne pas remettre en cause les
avantages financiers de la virtualisation de serveurs.
Dans un environnement idal, deux serveurs de vir-
tualisation seront relis au travers de deux switches
deux baies de stockages redondantes :

Dans le cadre de cet article, nous nous contenterons
dun serveur de virtualisation Vmware ESXi
1
et dun
baie de stockage quip de lOS Nexenta
2
.
1
http://www.vmware.com/fr/products/esxi/
2
http://www.nexenta.org/
Lors dun prcdent article, javais dj dcris une
architecture un peu similaire en utilisant la distribution
FreeNAS
3
; laquelle simplifiait grandement la gestion
des disques, des volumes de stockage et de la redon-
dance des disques et ladministration de la baie au tra-
vers dune interface WEB
4
.
Dans un autre article
5
, jai galement prsent le
ZFS
6
qui est un systme de fichier dvelopp par SUN
pour SOLARIS. Pour des raisons de licences, ZFS ne
peut tre intgr au noyau Linux. ZFS prsente de trs
nombreux avantages en termes de protection des don-
nes, volumtrique et de performance
7
.
1. ZFS mmorise la somme de contrle des don-
nes stockes sur le disque sous la forme dun code
en 256 bits. Ce code est vrifi chaque opration de
sorte que toute corruption des donnes par un mat-
riel dfaillant par exemple ne puisque passer inaperu
(DMA, cache de disque dur...).
2. ZFS utilise le copy on write ce qui signifie quun
bloc de donnes nest jamais modifi directement sur le
disque. En cas de modification, les critures sont ra-
lises dans un espace indpendant des donnes initia-
les et si toutes les sommes de contrle concident, alors
seulement, les nouvelles donnes sont valides.
3
http://freenas.org
4
2009/09 Stockage dport avec FreeNAS: VMware
ESXi, iSCSI et NFS
5
2009/09 Gestion avance des disques sous Linux: Raid,
LVM & ZFS
6
http://www.sun.com/software/solaris/zfs.jsp
7
http://opensolaris.org/os/community/zfs/docs/zfs_last.pdf
Solution
de stockage base sur ZFS et Ubuntu
La virtualisation de PC a amen de nouveaux besoins.
Alors que la concentration de serveurs fonctionnels
virtualiss par serveur physique de virtualisation
saccrot, la demande en termes de capacit de stockage
et de fiabilit des quipements saccrot galement.
Cet article explique :
Comment mettre en uvre une solution de stockage de trs
large capacit et scurise accessible en NFS ou ISCSI depuis
le rseau local (exemple: serveur de virtualisation).
Ce quil faut savoir :
Cet article demande une bonne connaissance de larchitecture
de stockage des PC et dun PC disposant dau moins trois dis-
ques durs.
Nexenta
www.phpsolmag.org 9
8.ZFS est un systme qui volue puisque sont prvus
sous peu le cryptage et la dduplication des blocs de
donnes en temps rel.
Juste titre dinformation, ZFS-FUSE (http://zfs-on-
fuse.blogspot.com/) propose aujourdhui un portage
sous GNU/Linux de ZFS en attendant la rponse libre
ZFS: BTRFS
8
.
Car en effet, ZFS nest pas un systme de fichier
libre. Il est disponible dans le noyau de OpenSolaris
9
,
donc gratuit, mais son code source nest pas dispo-
nible.
Qu cela ne tienne me direz-vous ! Il est vrai que
les caractristiques de ce systme ont de quoi lever
bien des objections un logiciel non libre.
Le problme est que passez OpenSolaris, cest
aussi rapprendre tout un jeu de commande durement
acquit sous GNU Linux.
Je vous donne un petit aperu des diffrences entre
les chemins systmes et les jeux de commandes:
Heureusement, la communaut du libre a entrepris
la tche de migrer les outils GNU vers OpenSolaris.
Ceci prend la forme dune distribution hybride entre
OpenSolaris et Ubuntu Hardy 8.04 : NEXENTA. Ne-
xenta existe en trois versions :
8
http://fr.wikipedia.org/wiki/Btrfs
9
http://fr.wikipedia.org/wiki/OpenSolaris
3.ZFS inclut un systme de snapshot ; cest dire
que lon peut accder aux donnes telles quelles ta-
ient un instant donn et ceci mme si des change-
ments ont t oprs ensuite.
4.ZFS organise les disques sous la forme de pool.
Ces quipes de disques peuvent tre redimensionnes
et le niveau de redondance entre disques est ajustable
(STRIPPING: pas de redondance; tous les disques sont
fusionns MIRROR: deux disques ont un contenu
identiques actualiss en temps rel RAIDZ/RAIDZ2:
le pool peut perdre un ou deux disques sans pertes de
donnes). La rpartition des donnes entre les disqu-
es est optimise de faon totalement automatique en
fonction des performances de chaque disque. On peut
par exemple mlanger des disques SSD pour la vitesse
et SATA pour la capacit.
5.ZFS est un systme de fichier 128 bits. Ne cher-
chez pas compter quelle capacit de disque cela fait;
cest plus que vous nen aurez jamais besoin !
6.ZFS peut contrler manuellement ltat des disqu-
es (SCRUB soit lquivalent dun chkdsk) en temps rel
sans dgradation de performances. Les rparations
sont effectues la vole et inscrites dans un journal
consultable par ladministrateur.
7.Le jeu de commandes administratives utilises par
ZFS est trs simple apprhender comme va le d-
montrer cet article.
Tableau 1. Comparaison de quelques dossiers systmes entre Linux et OpenSolaris
Linux OpenSolaris
/home /export/home
/var/log /usr/adm, /var/adm, /var/log
/tmp /var/tmp
/sys /devices
/dev /dev
/lib/modules/foo/* /kernel/drv/*
/boot/grub /rpool/boot/grub
Tableau 2. Comparaison des quelques commandes systme entre Linux et OpenSolaris
sudo pfexec
apt-cache search pkg search -r foo
apt-get install foo pkg install SUNWfoo
apt-get dist-upgrade pkg image-update
lsmod modinfo
insmod modload
rmmod modunload
top prstat
free vmstat
cat /proc/cpuinfo psrinfo -v
ifcong ifconfg -a
parted format
10/2010 10
Projets
NexentaCore : il s'agit dune distribution en ligne
de commande (http://www.nexenta.org/ ). Cest cet-
te version gratuite (license CDDL - http://www.sun.
com/cddl/cddl.html) que nous utiliserons pour met-
tre en uvre un serveur de stockage rseau NAS
utilisant la technologie ZFS.
NexentaStor : Il s'agit d'une distribution qui va d-
dier le PC o elle est installe pour raliser une
baie de stockage (http://www.nexenta.com/corp/ ).
Cette version est entirement administrable tra-
vers une interface WEB et dispose dextensions d-
dies (agent Vmware, client de backup Windows...).
Cette version de Nexenta est payante mais dispose
dun support professionnel. Sachez quil existe une
version dveloppeur gratuite jusqu 4To de don-
nes utiles.
StormOS : Cette distribution propose une station de
travail gratuite utilisant l'environnement de fentre
XFCE (http://stormos.org). Nexenta fonctionne sur
les architectures 32bits et 64bits.
Installation de Nexenta
Dans ce chapitre, nous allons prsenter les diffrentes
tapes dinstallation de la distribution Nexenta Core 3.
Cette tape reprsente la grande diffrence avec une
installation OpenSolaris typique. Par exemple, Nexen-
ta permet linstallation de lOS sur un miroir de disques.
Nexenta installe et configure automatiquement le servi-
ce de console distance scuris SSH. Nexenta active
par dfaut le service de partage iSCSI (target). Open-
Solaris aurait ncessit des tapes de post-installation
plutt laborieuses
Ds que vous avez tlcharg puis grav le CD
dinstallation de Nexenta Core, dmarrez votre PC
depuis ce Live-CD. Ensuite, choisissez la langue
dinstallation. Choisissez la zone gographique de votre
PC. Choisissez le pays de localisation du PC. Vrifiez
et validez lensemble de ces paramtres.
Nexenta dtecte ensuite lintgralit des disques
prsents dans votre PC. Comme vous pouvez le con-
stater, les conventions de dnomination des disques
(C1t0d0) sont trs diffrentes de ce que lon trouvera
sous Linux (/dev/sda1). Par exemple, C1t0d0 est le pre-
mier disque de la premire nappe du contrleur 1. Je
vous invite noter prcieusement ces informations ds
maintenant car, si vous avez beaucoup de disques et/
ou de contrleurs, elles vous seront bien utiles lors de
la cration des pool de disques.
Ds maintenant, comme je le mentionnais plus tt
dans cet article, vous pouvez slectionner deux ou trois
disque afin dinstaller lOS Nexenta sur un Mirror (deux
disques) ou un raidz (trois disques quivalent un
RAID5). Validez le fait que vous tes bien daccord po-
ur formater les disques prcdemment slectionns.
Il est temps de dfinir le mot de passe de lutilisateur
root. Attention, bien que vous ayez choisi une installa-
Figure 1. Site de Nexenta Core
Fi ure 1:Site de Nexenta Core
Figure 2. Site de NexentaStor
Figure 3. Site de StormOS
Nexenta
www.phpsolmag.org 11
tion en franais, le clavier est rest en anglais (bug !?!).
Confirmez que vous avez bien fini de dfinir le mot de
passe. Saisissez maintenant le nom dun nouvel utilisa-
teur sans privilges systme . La procdure est identi-
que celle de lutilisateur root lexception que vous
devez dfinir lidentifiant. Confirmez les paramtres de
cration du nouvel utilisateur. Maintenant, la squen-
ce dinstallation de NexentaCore va dfinir les caract-
ristiques rseaux de votre distribution. Indiquez tout
dabord le nom et le domaine auquel appartient ce PC.
Confirmez les informations saisies.
Linstallateur va maintenant dtecter toutes les car-
tes rseaux installes. Attention veiller ce que votre
matriel entre bien dans la grille de compatibilit de So-
laris. Sun propose dailleurs sur un site une applet JAVA
qui contrle la compatibilit avec Solaris du matriel sur
lequel elle est excute
10
. Dans le cadre de cet article,
le PC ne contient quune carte rseau fonctionnant au
Confirmation avant validation du mot de passe de root
gigabit. Bien videmment, en production, vous avez to-
ut intrt multiplier le nombre de cartes afin dajouter
quilibrage de charge et autre disponibilit votre baie
de stockage.
Vous devez dcider si la carte rseau se verra at-
tribuer une adresse IP par le serveur DHCP de vo-
tre rseau ou bien si vous souhaitez lui affecter une
adresse IP statique. Il est prfrable de choisir une
IP statique, prservant le fonctionnement de la baie
mme en cas de dfaillance du serveur DHCP (lequel
pourrait trs bien tre virtualis et stock dans la baie,
par exemple).
Saisissez ladresse et le masque de sous rseau que
vous souhaitez pour la baie. Si votre rseau nutilise pas
IPV6, il est inutile de demande le rglage suivant. Vali-
dez que vous souhaitez bien appliquer les paramtres
prcdents. Vous devez alors indiquer la passerelle
rseau qui sera applique toutes les cartes de la baie.
Si vous nindiquez pas de passerelle, les mises jour
par internet de NexentaCore ne seront pas possibles.
Saisissez ladresse IP de la passerelle. Vous devez au-
ssi prciser ladresse dun serveur de nom DNS afin de
terminer le rglage de la connexion de la baie Inter-
net. Saisissez ladresse IP du ou des serveurs de noms
de votre rseau.
Les rglages sont termins ! Linstallation de la distri-
bution va pouvoir commencer. Il ne vous reste plus qu
patienter. Sachez qu configuration matrielle gale,
NexentaCore (ou OpenSolaris) est moins rapides que
Linux. ZFS est galement trs gourmand de mmoire
vive.
Une fois linstallation termine, relancez le PC. Reti-
rez le CDROM et, au bout de quelques secondes, vous
vous trouverez devant linvitation saisir vos identifiants
pour accder la console dadministration.
10
http://www.sun.com/bigadmin/hcl/hcts/device_detect.jsp
Connectez-vous avec lidentifiant de lutilisateur
non privilgi et validez le fonctionnement de la couche
rseau.
Pour cela, tapez la commande suivante pour visuali-
sez ltat de vos cartes rseau (Figure 27).
Figure 4: cran de dmarrage du Live-CD NexentaCore
Figure 5:Menu de choix de la langue d'installation
Figure 6: Menu de choix de la zone gographique
Figure 7: Menu de choix du pays du PC
Figure 4. cran de dmarrage du Live-CD NexentaCore
Figure 5. Menu de choix de la langue dinstallation
Figure 6. Menu de choix de la zone gographique
Figure 7. Menu de choix du pays du PC
10/2010 12
Projets
dla star-link
LINK CLASS MTU STATE BRIDGE OVER
bnxO phys 1500 up -
Pour voir le dtail des rglages de vos cartes rseau,
tapez la commande (Figure 28).
ifcong -a
Si vous souhaitez modifier posteriori les caractristi-
ques rseaux de votre PC, modifiez le fichier de confi-
guration /etc/hostname.bnx0 avec lditeur nano.
sudo nano /etc/hostname.bnx0
Ce fichier contient une ligne qui ressemble ceci :
192.168.1.38 netmask 255.255.255.0 broadcast
+ up
SI tout fonctionne correctement, vous pouvez lancer la
mise jour de la distribution avec la squence de com-
mande suivante :
sudo apt-get update
sudo apt-get upgrade
Vous noterez lusage de sudo et de apt-get ports de
Ubuntu vers NexentaCore (ou aptitude si vous prfrez
cet outil).
Si vous devez relancer la machine, alors saisissez
la commande suivante:
sudo reboot -r
Cration des pools de disques
Lors de son installation, NexentaCore a cr un pool de
disque nomm syspool dans lequel il a plac les deux
ou trois disques slectionns.
Vous pouvez visualiser ce pool en tapant la com-
mande :
sudo zpool list
NAME SIZE USED AVAIL CAP
HEATH ALTROOT
syspool 330G 1,13G 239G
0% ONLINE -
LOS utilise 1,3 Go du pool et celui-ci est en parfait tat
de marche (status ONLINE). Vous lavez peut-tre re-
marqu mais ZFS retourne parfois des valeurs tran-
ges en ce qui concerne lespace libre (bug ?!?). Il ne
faut pas oublier quun pool organis en raidz utilise une
partie de lespace disque pour stocker des sommes de
contrle (tout le comme le ferait un RAID5). De plus, le
systme de fichier hberg par ce pool peut tre com-
press en temps rel.
On peut visualiser lorganisation des disques au sein
de ce pool avec la commande suivante:
sudo zpool status syspool
pool: syspool
state: ONLINE
Figure 9: Choix des disques o sera stock l'OS NexentaCore
Figure 10: Dernire validation avant formatage des disques
Figure 11: Dfinition du mot de passe de root
Figure 8: Validation des paramtres gographiques
Figure 8. Validation des paramtres gographiques
Figure 9. Choix des disques o sera stock lOS NexentaCore
Figure 10. Dernire validation avant formatage des disques
Figure 11. Dnition du mot de passe de root
Nexenta
www.phpsolmag.org 13
scrub: none requested
cong:
NAME STATE
READ WRITE CHKSUM
syspool
ONLINE 0 0 0
mirror ONLINE 0
0 0
c0t0d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
Les lignes ci-dessus signifient que syspool est compo-
s de deux disques placs en miroir (RAID1). Tous les
disques, le miroir et le pool fonctionnent parfaitement
(ONLINE). Aucun contrle dtat nest en cours (scrub:
none requested). Les 0 correspondent au Lecture
(READ) / criture (WRITE) ralises sur chaque disqu-
es par seconde. Pour linstant, il ne se passe donc pas
grand chose. Pour information, c0t0d0s0 fait rfren-
ce la premire partition s0 du premier disque d0 de
la premire nappe t0 du premier contrleur c0.Cration
dun pool de donnes
Vous allez maintenant crer un pool de disques
destin accueillir vos donnes que lon nommera da-
ta. Comme la machine de test possde deux disques
de 500 Go chacun, vous allez crer un pool permettant
dexploiter cet espace en volume et en redondance. No-
us allons configurer ce pool en raidz.
Pour cela, vous utilisez la commande suivante :
sudo zpool create data raidz c1t0d0 c1t1d0
c1t2d0 c1t3d0 c1t4d0 c1t5d0 c1t6d0 c1t7d0
c1t8d0 c1t9d0 c1t10d0 c1t11d0
Aprs quelques secondes seulement, le pool est dispo-
nible. On sassure que le pool est bien fonctionnel avec
la commande ci-dessous :
sudo zpool status data
pool: syspool
state: ONLINE
scrub: none requested
cong:
NAME STATE
READ WRITE CHKSUM
data
ONLINE 0 0 0
mirror ONLINE 0
0 0
c0t0d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
c0t1d0s0
ONLINE 0 0 0
Figure 14: Validation avant cration de l'utilisateur ubuntu .
Figure 12: Confirmation avant validation du mot de passe de root
Figure 13: Confirmation avant validation du mot de passe de ubuntu
Figure 12. Conrmation avant validation du mot de passe de root
Figure 13. Conrmation avant validation du mot de passe de ubuntu
Figure 14. Validation avant cration de lutilisateur ubuntu .
10/2010 14
Projets
Figure 19: Saisie de l'adresse IP de la baie.
Figure 20: Choix de la configuration IPV6
Figure 21: Validation avant application des rglages rseau.
Figure 22: Choix de configuration de la passerelle.
Figure 16: Validation avant configuration des paramtres rseau du PC
Figure 17: Confirmation du lancement de la procdure de configuration de la carte rseau
Figure 18: Choix d'attribuer une adresse IP statique la carte rseau de la baie.
Figure 16. Validation avant conguration des paramtres rseau
du PC
Figure 17. Conrmation du lancement de la procdure de
conguration de la carte rseau
Figure 18. Choix dattribuer une adresse IP statique la carte
rseau de la baie.
Figure 19. Saisie de ladresse IP de la baie.
Figure 20. Choix de la conguration IPV6
Figure 21. Validation avant application des rglages rseau.
Figure 22. Choix de conguration de la passerelle.
Figure 15: Dfinition du nom et du domaine du PC
Figure 15. Dnition du nom et du domaine du PC
Nexenta
www.phpsolmag.org 15
De la mme faon que prcdemment, on contrle la
capacit avec la commande :
sudo zpool list
NAME SIZE USED AVAIL CAP
HEATH ALTROOT
data 5.44T 3.21M 5.44T
0% ONLINE -
Vous allez ensuite rgler le pool afin quil rpare auto-
matiquement les problmes quil pourra dtecter. Pour
cela, on utilise la commande :
sudo set zpool set autoreplace = on
dataautoreplace est une des nombreuses options
disponibles pour un pool .. Si vous souhaitez faire ap-
paratre la totalit des options disponibles et les valeurs
associes, tapez la commande :
sudo sudo zpool get all data
Si vous souhaitez demander un contrle manuel de
ltat des disques, utilisez loption scrub avec la com-
mande zpool :
sudo zpool scrub data
La commande zpool status data vous permettra de
suivre ltat de lopration.
Vous pouvez rappeler lhistorique de toutes les com-
mandes ralises sur un pool avec la commande :
sudo zpool history data
Enfin, loption iostat vous permettra de suivre lutilisation
de votre pool en nombre de lecture/criture et le taux de
transfert par disques :
sudo zpool iostat -v data
Ajoutez -s 1 pour rafrachir laffichage chaque sec-
onde.
Accrotre la taille dun disque
Si lespace venait manquer, vous pouvez agrandir
votre pool de disques sans perte dactivit. ZFS pro-
pose la commande zpool add. Ainsi, pour ajouter les
disques c0t12d0 et c0t13d0 monts en miroir data,
tapez:
zpool add data mirror c0t12d0 c0t13d0
Cration de dataset au sein dun pool
Jusqu prsent, vous avez fusionn tous les disques
dans un disque virtuel de trs grande capacit. Il vous
reste organiser cet espace. On ne peut pas relle-
ment parler de partitions o cela sentend avec dautres
systmes de fichiers sous Linux ou Windows. Il sagit
despaces dynamiques, ajustables volont et potentiel-
lement limits uniquement par la taille du pool ; lequel
Figure 23: Saisie de la passerelle rseau
Figure 24: Choix de la configuration d'un serveur de nom
Figure 25: Saisie de l'adresse IP du serveur de nom DNS
Figure 26: L'installation de NexentaCore est termine!
Figure 23. Saisie de la passerelle rseau
Figure 24. Choix de la conguration dun serveur de nom
Figure 25. Saisie de ladresse IP du serveur de nom DNS
Figure 26. Linstallation de NexentaCore est termine!
10/2010 16
Projets
est galement extensible. Ces espaces sont appels des
datasets.
Vous allez maintenant crer un premier dataset nom-
m nfs-share dans le pool nomm data
sudo zfs create data/nfs-share
La commande zfs list affiche lintgralit des parti-
tions du disque virtuel.
sudo zfs list
NAME USED AVAIL REFER
MOUNTPOINT
data/nfs-share 5.44T 3.21M
/data/nfs-share
Vous noterez que le contenu du dataset est directement
accessible depuis le point de montage /data/nfs-share.
La capacit maximale du contenu de ce dataset est
celle du pool data soit 5To.
Gestion de la taille des partitions
Les partitions ZFS ne sont pas limites en taille indi-
viduellement. Ceci signifie que toutes les partitions
partagent la totalit du disque. Lespace est allou en
fonction des besoins. Toutefois, il peut tre ncessaire
de limiter la taille dune partition.
Pour cela, vous pouvez utiliser la commande zfs set
quota. Dans lexemple ci-dessous, le data data/nfs-
share sera limit une taille de 10 Go.
zfs set quota=10G data/nfs-share
La commande zfs get quota permet dafficher les
quotas attribus une partition.
zfs get quota data/nfs-share
Inversement, il peut tre utile de rserver un mini-
mum despace pour une partition et ainsi sassurer que
lespace ne viendra pas manquer le jour o il sera
utilis. Cette opration peut tre ralise avec la com-
mande zfs set reservation. Dans lexemple ci-des-
sous, la partition data/nfs-share se voit rserver 1Go
sur le disque.
zfs set reservation=1G data/nfs-share
Tapez la commande zfs get all data/nfs-share
pour sassurer que les modifications ont bien t appli-
ques (Listing 1).
Au passage, vous noterez que la liste des options
est assez longue. On y trouve notamment loption de
compression des donnes en temps rel.
ZFS supporte la compression native des datasets.
Vous pouvez commander la compression du dataset
nfs-share avec la commande :
sudo zfs set compression=on data/nfs-share
Vous pourrez facilement atteindre un taux de compres-
sion de 1.4 sans dgradation notable des performances.
dla star-link
LINK CLASS MTU STATE BRIDGE OVER
bnxO phys 1500 up -
Figure 27: Etat des cartes rseau
Figure 28: Configuration de la carte rseau
Figure 29: Listing des options du zpool
Figure 28. Conguration de la carte rseau
Figure 27. Etat des cartes rseau
Figure 29. Listing des options du zpool
Nexenta
www.phpsolmag.org 17
Pour valider que le partage est bien actif et connatre
son identifiant de partage, tapez la commande :
sudo itadm list-target
Figure 32. cration dun partage ISCSI
Depuis fin dcembre 2009, un dataset dispose
galement dune option de dduplication de donnes
en ligne. Contrairement la compression, la ddupli-
cation factorise la rduction de volume en ne stockant
quune fois un bloc de donne dj prsent dans un
dataset.
Suppression dune partition
La suppression du dataset nfs-share du pool nomm
data est aussi simple que :
sudo zpool destroy data/nfs-share
Partage dun dataset en NFS
Si vous souhaitez partager tout le contenu du dataset
nfs-share au travers du protocole NFS, il vous suffira de
tapez la commande :
sudo zfs set sharenfs=anon=0 data/nfs-share
La squence sharenfs=anon=0 nous affranchi de to-
ut problme de lecture/criture sur le partage li des
droits dutilisation du dataset. Si vous aviez saisi
sharenfs=on, une authentification avec un compte uti-
lisateur NexentaCore valide serait requis pour crire
dans le dataset. Si votre baie dispose de plusieurs car-
tes rseau, le partage est disponible depuis chacune
des adresses IP. Vous pouvez quilibrer la charge entre
les deux cartes rseaux configurant vos serveurs po-
ur quils sadressent la baie au travers des multiples
cartes.
Partage dun dataset en iSCSI
Si vous souhaitez partager un dataset au travers du pro-
tocole ISCSI
11
, sa taille doit imprativement tre fige.
Il faut simaginer que le dataset est en ralit un fichier
stock dans le pool et que cest le contenu de ce fichier
qui est prsent au rseau au travers de ISCSI.
La cration dun dataset de 1To seffectue avec la com-
mande suivante :
sudo zfs create -V 1T data/iscsi-share
On partage ensuite ce dataset avec la commande :
sudo zfs set shareiscsi=on data/iscsi-share
Il faut bien avoir en tte que si ZFS ne connat pas de li-
mitations pratiques pour la taille des pool et des datasets,
ce nest pas le cas des autres systmes dexploitation.
Aussi, dans la pratique, il est inutile dexporter un data-
set de plus de 2To car il ne pourra pas tre exploit par
dautres systmes que Solaris.
11
http://fr.wikipedia.org/wiki/Internet_Small_Computer_
System_Interface
Figure 30: Analyse de l'usage des disques en temps rel
Figure 31: Usage d'un pool en temps rel
Figure 32: cration d'un partage ISCSI
Figure 30. Analyse de lusage des disques en temps rel
Figure 31. Usage dun pool en temps rel
10/2010 18
Projets
Si votre baie dispose de plusieurs cartes rseau, le
partage est disponible depuis chacune des adresses
IP. Vous pouvez quilibrer la charge entre les deux
cartes rseaux configurant vos serveurs pour quils
sadressent la baie au travers des multiples cartes.
Configurer Vmware ESXi pour utiliser
NexentaCore
Maintenant que NexentaCore est fonctionnel et quil ex-
porte vos disques vers le rseau au travers des proto-
coles NFS et iSCSI, il reste configurer Vmware ESXi
afin dutiliser ces espaces de stockage distants.
La configuration des datastore est ralise depuis le
menu configuration.
Cration dun datastore NFS
La cration dun datastore NFS est extrmement simple.
Depuis linterface dadministration de Vmware ESXi, cli-
quez sur loption storage dans le menu de gauche puis
cliquez sur le lien add storage en haut droite. Un assi-
stant va sous guider dans la cration du datastore. Cho-
isissez tout dabord lassistant pour un network file Sy-
stem. Cliquez sur le bouton NEXT.
Vous devez saisir ladresse IP (192.168.1.38) de vo-
tre NexentaCore dans le champ server et nom de vo-
tre partage NFS (data/nfs-share) dans le champ folder.
Nommez votre datastore dans le champ datastore na-
me. Cliquez ensuite sur next. Votre datastore est prt et
fonctionnel.
Il ne vous reste plus qu cliquer sur le bouton finish.
Dsormais, lorsque vous crerez une machine virtuelle,
il vous sera propos dentreposer ces disques virtuels
dans le datastore distant NFS datastore. Le reste de
lutilisation de ESXI est totalement inchange.
Cration dun datastore iSCSI
La cration dun datastore ISCSI est lgrement plus
complexe car elle require deux tapes :
l'tablissement d'un lien entre ESXi et le serveur
ISCSI (c'est dire NexentaCore),
la cration du datastore proprement parler.
La premire tape est accessible depuis le menu de
droite nomm storage adapters. Slectionnez ensuite
la ligne en dessous de iscsi storage adapters. Cliquez
Listing 1.
NAME PROPERTY VALUE SOURCE
data/nfs-share type lesystem -
data/nfs-share creation ven mai 15 12:44 2009 -
data/nfs-share used 24,0K -
data/nfs-share available 10,0G -
data/nfs-share referenced 24,0K -
data/nfs-share compressratio 1.00x -
data/nfs-share mounted no -
data/nfs-share quota 10G local
data/nfs-share reservation 1G local
data/nfs-share recordsize 128K default
data/nfs-share mountpoint /data/nfs-share local
data/nfs-share sharenfs off default
data/nfs-share checksum on default
data/nfs-share compression off default
data/nfs-share atime on default
data/nfs-share devices on default
data/nfs-share exec on default
data/nfs-share setuid on default
data/nfs-share readonly off default
data/nfs-share zoned off default
data/nfs-share snapdir hidden default
data/nfs-share aclmode groupmask default
data/nfs-share aclinherit restricted default
data/nfs-share canmount on default
data/nfs-share shareiscsi off default
data/nfs-share xattr on default
data/nfs-share copies 1 default
data/nfs-share version 3 -
data/nfs-share utf8only off -
data/nfs-share normalization none -
data/nfs-share casesensitivity sensitive -
data/nfs-share vscan off default
data/nfs-share nbmand off default
data/nfs-share sharesmb off default
data/nfs-share refquota none default
data/nfs-share refreservation none default
data/nfs-share primarycache all default
data/nfs-share secondarycache all default
data/nfs-share usedbysnapshots 0 -
data/nfs-share usedbydataset 24,0K -
data/nfs-share usedbychildren 0 -
data/nfs-share usedbyrefreservation 0
Nexenta
www.phpsolmag.org 19
OLIVIER OLEJNICZAK
Responsable informatique de lditeur logiciel silog.fr.
Cofondateur du blog www.synergeek.Fr.
Membre de Calvix.org.
enfin sur le lien properties en haut droite de la zone
details. Assurez-vous que le protocole ISCSI est bien
activ sur votre serveur ESXi en cliquant sur longlet
gnral. Dans longlet dynamic discovery du formulaire
de paramtrage du client ISCSI de ESXi, cliquez sur le
bouton add.
Indiquez dans la zone ISCSI server, ladresse IP du
serveur NexentaCore (192.168.1.38).
Fermez cet assistant. ESXi va vous proposer de par-
courir tous les serveurs ISCSI dfinis afin de dtecter
les disques disponibles. Acceptez mais sachez que cet-
te tape ncessaire peut prendre plusieurs minutes.
Retourner dans le menu droit storage et relancer
lassistant de cration de datastore en cliquant sur le
lien add storage en haut droite.
Cette fois ci, choisissiez loption disk/lun.
Lassistant va vous proposer la liste des disques d-
tects sur lopration de rescan mentionne plus haut
dans cet article. Slectionnez le disque que vous sou-
haitez utiliser comme datastore. Le champ san identifier
se termine par le nom de lextend utilis dans Nexenta-
Core (commande = sudo itadm list-target). Ltape
suivante vous rappelle que le disque est vierge et quil
va tre format. Saisissez le nom que vous souhaitez
donner ce datastore. Les paramtres du formatage du
disque doivent tre ajusts en fonction de la taille ma-
ximale du disque de machine virtuelle qui y sera dpo-
s. Cliquez sur next. Le datastore ISCSI est dsormais
oprationnel.
Il ne vous reste plus qu cliquer sur le bouton finish.
Dsormais, lorsque vous crerez une machine virtuelle,
il vous sera propos dentreposer ces disques virtuelles
dans le datastore distant NFS datastore. Le reste de
lutilisation de ESXI est totalement inchang.
Si vous souhaitez crer dun datastore de plus de
2To, il faut suffit de crer plusieurs datasets parta-
gs en ISCSI sur NexentaCore puis de les fusionner
en cliquant dans la zone extents disponible avec un
clic sur le bouton droit de la souris sur le datastore
ISCSI.
Lexprience montre que les accs un disque vir-
tuel stock dans un datastore iSCSI sont 5 10 fo-
is plus rapide que pour un datastore NFS, surtout en
charge. Toutefois, cette mesure dpend grandement de
lutilisation qui est faite de la machine virtuelle.
Conclusion
Au terme de cet article, vous disposez dsormais dun
baie de stockage de trs haute performance mue par
la distribution NexentaCore et porte par le systme
de fichier ZFS. Le choix entre OpenSolaris ou Nexen-
taCore est purement pratique car NexentaCore permet
lutilisateur de Ubuntu de retrouver une ligne de com-
mande familire. Les puristes prfreront srement la
version SUN OpenSolaris, gage de compatibilit et de
rapidit de rplication des correctifs.
De trs nombreux aspects relatifs lOS (Haute
disponibilit des cartes rseau, synchronisation entre
baies...) et ZFS (snapshot, clones, backup, disques
de secours, rparation de pools.....) nont pas t abor-
d dans le cadre de cet article mais devront tre mis en
uvre avant la mise en exploitation dune telle baie de
stockage.
Figure 36: Recherche de partages ISCSI sur le rseau
Figure 33. Choisir entre la cration dun datastore NFS ou iSCSI
Figure 34. Ajout dun datastore NFS
Figure 36. Recherche de partages ISCSI sur le rseau
10/2010 20
Dossier
AJAX en tant que rponse une
problmatique. Description de l'volution
du web des annes 1990 2005
Le Web dans les annes sombres de 1990 prsen-
tait des pages HTML statiques. La plupart des pages
taient du texte mises en forme grand renfort de bali-
ses HTML , et nous tions fascins par les liens hyper-
textes. Certains fous du design y ajoutaient des images
et quelques effets visuels, aussitt nous dsactivions
tout cela pour laisser respirer nos modems asthmati-
ques.
En quelques annes, la tendance porter la charge
sur le poste client en applications diverses s'accentua,
il fallait alors allger le plus possible la communication
Web, au vue de l'expansion du rseau Internet. Les
technologies de script ct client dont certaines pro-
pritaires aux navigateurs, des solutions base de plu-
gins furent flors et l'ignorance des recommandations
du W3C alourdirent considrablement la tche du d-
veloppeur.
Au tout dbut du sicle, la baisse des cots des
serveurs, l'amlioration des dbits et des infrastruc-
tures ont favoris le transfert des traitements dyna-
miques des pages vers le serveur Web. Le dvelop-
pement de technologies serveurs et des langages
serveurs taient assurs. En revanche, la charge aug-
menta ct serveur et engorgea le rseau. Dans ce
western sauvage, surgit Jesse James Garett, auteur
d'un article et d'un compromis sur la relation client-ser-
veur.
Prsentation de l'article fondateur Ajax
de Jesse James Garrett du 18 fvrier 2005
Jesse James Garrett a l'ide de runir sous un acrony-
me AJAX un ensemble de technologies qui font le Web
de son poque. Mais c'est un peu plus que cela, il com-
prend qu'il ne faut pas interrompre l'utilisation de la pa-
ge Web par des requtes au serveur, qui entranent un
gel de la page et nuisent son utilisation . Il faut faire
circuler sur le rseau le strict ncessaire d'information
pour la demande de la page du client et en tche de
fond, Magister dixit (Le matre l'a dit ). Un langage ser-
vira de glu l'ensemble des technologies avec la pos-
sibilit de communiquer en asynchrone : the winner is
JavaScript.
Dfinition du RIA (Rich Internet Application)
Aujourd'hui, l'utilisateur ne conoit pas (et ne veut
pas) de diffrence entre une application en locale et
sur rseau web, la technologie s'efface pour lais-
ser place une exprience utilisateur qui se foca-
lise sur l'objet de sa demande et non sur la faon
de l'adresser. L'utilisateur s'attend alors aux mmes
fonctionnalits de part et d'autre, quelque soit le sup-
port, l'environnement ou le type d'informations de-
mands. Le web doit tre capable de fournir toutes
ces fonctionnalits souhaites avec une ractivit
toujours plus accrue. L'ensemble des technologies
qui permettent ce paradigme rpond l'acronyme de
RIA (Rich Internet Application) : application internet
riche.
AJAX
et PHP
'Il n'y a pas au monde de pire malheur que la servitude.'
Sophocle (extrait de Ajax). Dans cet article, nous apprendrons
pourquoi et comment est n le concept Ajax, son utilisation
avec PHP. Nous aborderons les avantages de la communication
asynchrone et ses limites, les solutions apportes et sa mise
en uvre.
Cet article explique :
Historique et description technique AJAX.
Difrentes implmentations de AJAX.
Communication entre AJAX et PHP.
Mise au point avec Firebug.
Ce qu'il faut savoir :
Base de la communication HTTP.
Bonne connaissance des fondements JavaScript.
Bonne connaissance PHP 5.2.
Notion du DOM et CSS.
Ajax et PHP
www.phpsolmag.org 21
au script client et avec XMLHttpRequest se connecte
au serveur. L'utilisateur peut pendant ce temps conti-
nuer utiliser la page, par exemple, pour voir des arti-
cles similaires en faisant dfiler une zone sur la mme
page.
Le serveur web reoit la demande, interroge une
base de donnes, construit la rponse ncessaire uni-
quement, ici dans une chane HTML contenant la des-
cription. Le serveur renvoie la partie qui satisfait la
demande, et le navigateur l'affiche (HTML et CSS).
L'utilisateur n'a t aucun moment contraint d'atten-
dre cette rponse.
Vous pouvez exprimenter Ajax sur Google, vous
verrez que la recherche s'effectue chaque vnement
d'appui de touche et la liste s'enrichit trs rapidement
au fur et mesure des lettres successives en donnant
cet aspect de fluidit.
numration de techniques alternatives sans Ajax
D'autres techniques alternatives existent et peuvent
sauver la mise lors de spcifications bien particulires.
On peut citer :
Les applications Java pour le web : les applets (sur
le client) et servlets (sur le serveur),
Flex - Flash player et son plugin,
Cadre cach avec l'utilisation de iframe, elle fait of-
ce de cache et une fois prte renvoie la partie uti -
le la page cliente.
Description technique de AJAX
Rappel (AJAX = Asynchronous JavaScript+CSS+DOM
+XMLHttpRequest). Jesse James Garrett dfinit AJAX
comme un ensemble de technologies et donne un ca-
dre de dveloppement base de standard, ou plutt de
recommandations selon la terminologie W3C. En nu-
mrant les diffrentes couches, on dfinit la sparation
entre la prsentation des donnes et leurs interroga-
tions, ce qui n'est pas sans rappeler le modle MVC
(Modle Vue Contrleur).
La prsentation est assure par HTML/XHTML
et CSS et sa structure dynamique repose sur le
DOM (Document Object Model),
La manipulation des donnes par XSLT et l'chan-
ge par XML (et plus),
L'orchestration est contrle par JavaScript utilisant
son objet ftiche XMLHttpRequest.
Description de l'acronyme AJAX en approfondissant
l'asynchrone et le X
Asynchronous JavaScript+CSS+DOM+XMLHttpReque
st, on prend le dbut et la fin, on obtient un nom un peu
marketing AJAX. C'est vendu ! En dtail, regardons la
diffrence entre une communication synchrone et asyn-
chrone.
Premier cas de figure le modle classique synchrone
L'utilisateur partir de la page web fait une demande
HTTP sur le serveur, par exemple, il veut connatre
la description de l'article qu'il dsire acheter. La page
se gle et attend la rponse du serveur. Le serveur
web reoit la demande, interroge une base de don-
nes, refait entirement la page d'achat du client. Le
serveur renvoie la totalit de la page au navigateur
qui l'affiche (HTML et CSS). La page se rafraichit en
clignotant, ce qui indique le rechargement entier de
la page.
L'utilisateur peut nouveau naviguer.
Deuxime cas de figure le modle Ajax asynchrone
L'utilisateur partir de la page web fait une demande
HTTP sur le serveur, il veut toujours connatre la des-
cription de l'article. En interne, le navigateur fait appel
Figure 1. Communication synchrone et asynchrone
Figure 2. Google et sa compltion automatique
10/2010 22
Dossier
Comment l'implmenter, prsentation
de la classe XMLHttpRequest
et ActiveXObject pour Microsoft
Depuis longtemps les navigateurs, au dbut l'Internet
Explorer de Microsoft, peuvent faire de l'asynchrone.
Cet objet existe sous deux entits diffrentes : un Ac-
tiveX pour Microsoft nomm ActiveXObject et XMLHtt-
pRequest pour les autres. Microsoft a dclin son ob-
jet sous deux formes pour la version suprieure 5.0
et Internet Explorer 5.0. Nous allons crire le code pour
faire le choix et la dtection notre place. Code choix
de l'objet : criture du createXHR() l'appel se fera sim-
plement par : var objetXHR = createXHR() ;
Tableau des attributs et mthodes
Un objet, c'est un ensemble d'attributs (tats) et de m-
thodes (comportements).
Notion de callback : par mthode de callback, nous
appellerons une fonction qui observera en tche de fond
le changement d'un tat donn et excutera la fonction
passe en paramtre.
Valeurs de readyState
Un exemple simple
L'exemple s'crit en JavaScript, il peut s'appeler au
chargement de la page ct client.
On utilise la mthode de cration de l'objet createXHR()
implmente prcdemment.
Les conditions de l'appel sont les suivantes :
appel par la mthode GET,
un script reponseScript.php (le script est cens blo-
quer l'interaction utilisateur sur le poste client) re-
tourne un texte,
La communication client-serveur est asynchrone.
Ce script ne prend pas de paramtre pour la mthode GET
On instancie l'objet XMLHttpRequest
var objXHR = createXHR() ;
That's all folks!
Pour rester simple, nous ne faisons pas intervenir le
DOM, ni CSS, ce qui ne correspond pas stricto sensu la
dfinition d' AJAX. A l'aide de ce script concis, on peut
se rendre compte que l'inscription d'une requte AJAX
relve d'une mthodologie et d'un ordonnancement pr-
cis. Cette mthodologie est suivre chaque fois, selon
l'orientation que nous voulons donner notre requte. En
d'autres termes, le traitement des erreurs et des tats de
l'instance XMLHttpRequest peut tre assez vari.
Aprs l'excution de send(), on peut afficher les
en-ttes de rponses HTTP. Par exemple :
client.onreadystatechange = function() {
if(this.readyState == 2) print(this.getAllR
esponseHeaders()); }
Listing 1. Choix de l'objet XHR
function createXHR() {
var xmlHttpReq = null;
if(window.XMLHttpRequest){ //IE7 et plus, Firefox,
Safari, Opera....
var xmlHttpReq = new XMLHttpRequest();
return xmlHttpReq;
} else if (window.ActiveXObject) { //on part au pays
de Microsoft
try {
return new ActiveXObject("Msxml2.XMLHTTP");
//Internet Explorer version > 5.0
} catch (err) {}
try {
return new ActiveXObject("Microsoft.XMLHTTP");
// Internet Explorer version 5.0 !
} catch (err) {}
}
throw new Error("Impossible de crer l'objet
"+"XMLHttpRequest pour le navigateur.");
}
Listing 2. Le moteur AJAX
// on implmente le callback comme fonction anonyme
objXHR.onreadystatechange = function() {
// on test les ags readyState (4 : complete) et
status (200 : OK du HTTP)
if(this.readyState == 4 && this.status == 200 ){
//Si c'est une rponse texte
if(this.responseText != null ) {
//On rcupre la valeur et on l'afche
var resultText = this.responseText ;
alert( resultText) ;
} else return ;
}
}
Listing 3. Les appels de fonctionnalits
//Appel du script PHP avec une mthode GET sans
paramtre.
objXHR.open("GET", "reponseScript.php", true) ;
//On envoie la requte
objXHR.send(null) ;
Listing 4. Le script reponseScript.php
<?php
//Type de la rponse renvoyer
header("Content-Type: text/plain");
echo "Bonjour du script".$ _ SERVER['SCRIPT _ NAME'] ;
?>
Listing 4B. Manipulation du DOM
innerHTMLContent(id, newContent) {
var elt = document.getElementById(id) ;
if(elt != null) {
while(elt.rstChild) {
elt.removeChild(elt.rstChild) ;
}
var inner = document.createTextNode(newContent) ;
elt.appendChild(inner) ;
}
}
Listing 5. Chargement startAjax
<script type="text/javascript">
window.onload = function() {
startAjax ;
// autres scripts charger
}
</script>
Ajax et PHP
www.phpsolmag.org 23
10/2010 24
Dossier
Tableau 1. Liste des mthodes et attributs
Mthode et attribut Paramtre et description
open(method, url, async) Ouvre une connexion l 'URL du script ct serveur
method = HTTP (GET, POST, etc.)
url = url ouvrir, peut inclure une chane de requte
async = prcise si la connexion doit tre asynchrone (true) ou bien synchrone (false)
onreadystatechange Afecte une fonction objet comme callback (syntaxe identique l'afectation du
modle vnement du navigateur)
setRequestHeader (name,value) Ajoute un header la requte HTTP pour prciser la nature du corps de la requte
passe par send() en cas de POST
send(body) Envoi de la requte
body = null pour GET, une chane pour POST
abort() arrte le XHR qui coute la rponse
readyState tat du cycle de vie de la rponse (renseign aprs que send() soit appele)
Status Code de retour de HTTP (un entier)
responseText Corps de la rponse du serveur sous forme de texte
responseXML Corps de la rponse du serveur sous forme XML
getResponseHeader (name) Lecture de la rponse de l'en-tte prcis par son nom
getAllResponseHeaders() Retour de tous les en-ttes HTTP dans une seule chane
Tableau 2. Liste des valeurs readyState
tat Valeur Description
0 Uninitialized La requte n'est pas encore envoye (open() non appele)
1 Loading Initialise mais la rponse n'est pas arrive car la mthode send() n'a pas t excute
2 Loaded Les en-ttes de rponse peuvent tre lus, send() a t excute
3 Interactive La rponse est en cours de rception, elle est incomplte, mais elle peut tre lue.
4 Complete La rponse du serveur est complte. La proprit responseText ou responseXML con-
tient le rsultat en fonction du type de donnes.
On peut dsirer une politique de granularit des ex-
ceptions sur les paramtres en lecture seule comme
readyState et status, pour les traiter de faon diff-
rencie. Pour status, les codes de retour HTTP aver-
tissent l'utilisateur ou le script du problme : 200 OK,
404 page not found, 403 forbidden, par exemple. Une
liste exhaustive des codes de retour se trouve sur le site
Internet du W3C.
Restrictions et solutions
Tout n'est pas merveilleux dans le monde AJAX. La pre-
mire condition sera que la requte s'effectue sur le m-
me serveur, restriction qui ne tardera pas tomber au
regard de la nouvelle implmentation de XMLHttpRe-
quest 2. Les frameworks JavaScript proposent dj des
solutions quasi-automatiques. Il existe plusieurs mtho-
des alternatives, certaines sont cites succinctement ci-
aprs.
Schma serveur diffrent : mthode proxy le ser-
veur peut interroger un autre serveur, il n'y a pas de
restriction.
Mthode base de iframe :
On utilise une balise <iframe></iframe> que l'on rend in-
visible grce ses proprits CSS. L'intrt est que l' ifra-
me ne souffre pas de la restriction de l'interrogation d'un
service sur un serveur diffrent du serveur hbergeur.
Mthode cross domain :
Microsoft avec XDomainRequest et XMLHttpRequest 2
propose en plus de la simplification de syntaxe le cross
domain, il suffit d'indiquer dans l'URL, le domaine dis-
tant atteindre : par exemple objXHR.open("GET",
"http://www.domainservicedistant.net/script.
php", true);
Le protocole HTTP
Le protocole HTTP permet un transfert de fichiers. Ce
qui importe, c'est l'criture de l'URL et l'criture d'en-t-
te. Il est dfini par une RFC, la rfc2616 pour le protocole
HTTP/1.1du W3C.
Une URL get avec ses paramtres visibles :
http://<HOST>:<PORT>/lescript.php?param1=valeur1
&param2=valeur2
HOST c'est l'adresse de l'hte de la ressource attein-
dre.
PORT est par dfaut gal 80, il peut tre omis.
Ajax et PHP
www.phpsolmag.org 25
Les en-ttes HTTP
Les en-ttes (headers), nous serons intresss essen-
tiellement par :
Content-Type : par exemple text/xml, pour prciser
quel type de donnes est envoy,
Cache-Control : contrle du cache, pour le dsacti-
ver le cache vaut no-cache pour HTTP 1.1,
Pragma : pour le dsactiver le cache vaut no-cache
pour HTTP 1.0.
Rappels GET/HEAD/POST
GET
C'est une mthode pour demander une ressource URL.
Les paramtres, s'ils existent, sont passs dans l'URL
et sont donc visibles,
HEAD
C'est une demande d'information de la ressource elle-
mme,
POST
Soumission de formulaire, les paramtres ne sont pas
visibles dans l'URL.
PHP et AJAX. Pas de communication PHP
avec JavaScript
Il est souvent question pour les dbutants de vouloir fai-
re communiquer ces scripts, par exemple, que JavaS-
cript utilise une fonction PHP. Ce n'est pas possible! Le
PHP s'excute sur le serveur, le JavaScript ct client.
De plus l'instant n'est pas le mme, quand Javascript
s'excute ct client le PHP 'n'existe plus', le serveur l'a
renvoy sous forme HTML + Javascript. Et pourtant...
PHP peut construire du JavaScript la vole, qui sera
renvoy par le serveur, donc on peut dire qu'il y a rela-
tion. De la mme faon, un formulaire HTML construit
par PHP peut ragir des vnements JavaScript.
Javascript peut construire aussi un formulaire, le
soumettre et faire une requte un script PHP, donc il
y a aussi interaction. Mais ce sont des interactions in-
directes, qui ncessitent des aller-retours entre le client
et le serveur.
1 le navigateur client demande au serveur une pa-
ge php soit par lien HTML ou par JavaScript,
2 le serveur obtient la page,
3 le serveur excute le php (qui peut crire ou mo-
dier du texte JavaScript),
4 la rponse amne un chier interprtable par le
navigateur (XHTML + JavaScript par exemple).
Ce schma, plutt symbolique, permet de comprendre
que JavaScript du client n'est jamais en relation directe
avec le PHP du script php.
Ajax appel 'script php' et interagit sur le DOM :
Le DOM, permet de reconstituer le document sous
forme d'un arbre et de nuds. On peut ajouter,
modier, supprimer un nud ou un ensemble de
nuds, ses attributs et valeurs,
JavaScript autorise la manipulation de l'arbre syn-
taxique du DOM.
Introduction innerHTML et l'alternative JavaScript
de manipulation du DOM
La mthode la plus commune pour afficher un rsultat
de type texte dans une balise HTML avec JavaScript
est innerHTML :
pour une balise HTML avec un Id 'textAjax'
<span id="textAjax">&nbsp;</span>
Code JavaScript avec innerHTML :
document.getElementById("textAjax").innerHTML
= objXHR.responseText ;
Cependant l'attribut innerHTML ne fait pas parti des sp-
cifications du DOM. Toutefois, cet attribut est largement
Figure 4. Schmas PHP sur serveur Javascript sur client
Figure 3. Mthode proxy
10/2010 26
Dossier
diffus sur les navigateurs rcents. Malgr tout, il peut
tre judicieux d'crire correctement les choses...
Manipulation des nuds DOM
Pour remplacer innerHTML, en pure manipulation du DOM,
on crit la fonction du Listing 4B. L'appel devient donc : inne
rHTMLContent("textAjax" , objXHR.responseText);
Il nous manque pour un AJAX complet, un traitement CSS.
Dans le fichier client, on trouve le HTML suivant :
<span class= "message" id="textAjax">&nbsp;</
span>. inclure dans un chier CSS part ou bien en
dbut de script entre les tags <head></head>
<style type='text/css'>
span.message {
color: red ;
font-size: bold ;
}
</style>
Maintenant les textes des span qui ont une classe mes-
sage seront en rouge et gras.
Diffrents types d'envois
Pour dclencher l' AJAX, nous avons besoin d'un v-
nement. Dans la page une fois charge (voir Listing 5),
on excute notre fonction startAjax (voir Listing 6).
Sans paramtre,
On reprend le code prcdemment crit et on modifie
l'appel alert() pour conserver le rsultat dans la page
(voir Listing 6).
Avec GET paramtr texte,
Le problme avec AJAX, c'est la mise en cache auto-
matique de certains navigateurs. Pour viter cela, il faut
un peu lui mentir, faire croire que notre requte est nou-
velle chaque fois.
Sinon, le navigateur renvoie son cache !
Comme toujours en programmation, le temps va
nous permettre d'obtenir un rsultat variable.
Il suffit de passer ce paramtre par GET, aprs le point
d'interrogation, on crit ces lignes avant l'appel open()
(voir Listing 7).
Avec POST paramtr texte.
Avec POST, les paramtres de l'URL disparaissent, mais
comme rien ne se perd mais tout se transforme, on d-
finit les paramtres dans une variable :
var param = "utilisateur=root&codePasSecret=
1234" ;
Listing 6. Le moteur AJAX
function startAjax() {
var objXHR = createXHR() ;
objXHR.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200 ){
if(this.responseText != null ) {
var resultText = this.responseText ;
document.getElementById("textAjax").innerHTML =
resultText ; // la place de alert()
} else return ;
}
}
}
L'appel
objXHR.open("GET", "script.php", true);
objXHR.send(null) ;
Listing 7. Appel du script GET
<?
var nocache = new Date().getTime() ;
objXHR.open("GET", "script.php?cache=" + nocache,
true);
objXHR.send(null) ;
Listing 8. Appel du script POST paramtr
<?
objXHR.setRequestHeader( "Content-Type", "application/
x-www-form-urlencoded") ;
objXHR.open("POST", "script.php" , true);
objXHR.send(param) ;
Listing 9. Renvoi de la page
<?php
header("Content-Type: text/plain; charset=utf-8");
header("Cache-Control: no-cache , private") ;
header("Pragma: no-cache") ;
if(isset($ _ POST['utilisateur']) && $ _
POST['utilisateur']= = 'root' )
echo $ _ POST['utilisateur']." vous tes un idiot!"
;
?>
Listing 10. Renvoi de la page
<?php
header("Content-Type: text/plain");
if(isset($ _ POST['nom']) && trim($ _ POST['nom'])!='') $nom
= $ _ POST['nom'] else $nom = 'M.John Doe' ;
$reponse = "Bonjour ".$nom . "! ";
echo $reponse ;
?>
Listing 11. objet JSON
//javascript objet JSON
{
"nomObjet":
{
"attribut _ 1":"valeur _ 1",
"attribut _ 2":"valeur _ 2"
}
}
Listing 12. Parse la rponse
function parseResponse(objXHR){
var jsonObj=eval(
"("
+objXHR.responseText
+")"
);
var result1 = jsonObj.nomObjet .attribut _ 1;
return (result1) ;
}
document.getElementById("result1").innerHTML =
parseResponse(objXHR) ;
Ajax et PHP
www.phpsolmag.org 27
nous allons avertir le serveur que nous postons, donc
on l'indique l' header (voir Listing 8).
Le script php :
Il rcupre les paramtres et envoie une apprcia-
tion (voir Listing 9).
Note : les headers donnent le type de la page ren-
voy (text/plain) ainsi que la faon dont le cache est
gr (ici no-cache). Dans la balise span textAjax du
client le message 'root vous tes un idiot!' doit appara-
tre en rouge et gras. Les exemples ci-dessus ont tous
des paramtres d'envoi texte simple. Toutefois, les pa-
ramtres transmis au serveur peuvent tre au format
JSON, XML, fragment du DOM (XML), etc. Ceci mo-
difie le type de header envoyer et ajoute un traite-
ment de l'argument supplmentaire, mais la logique de
l' AJAX reste la mme. PHP dans sa version suprieure
5.2 permet une approche simplifie de ces traitements
grce aux fonctions json_* et simplexml_*. Dans tous
les cas, on peut lire les donnes brutes (raw data) en-
voyes par POST par :
<?php $postdata = file_get_contents("php://
input"); ?>
Diffrents types de format de donnes pour
les rponses
L'objet XMLHttpRequest a deux proprits qui contien-
nent les rponses :
1 responseText contient les donnes sous forme de
chane texte,
2 responseXML contient les donnes en xml vali-
de. Dans le cas contraire contient null, et le retour
sera du texte dans responseText.
Firefox supporte un attribut overrideMimeType, cri-
re juste la suite de l'instanciation de XMLHttpRequest.
Ceci permet d'informer le navigateur que les donnes
en retour auront un Content-Type: text/xml.
if (objXHR.overrideMimeType) objXHR.
overrideMimeType('text/xml') ;
La mthodologie du script de rponse repose sur un or-
dre prcis d'tapes respecter :
1 Envoyer un header correspondant la nature de
la ressource retourne. Sans aucune instruction
de sortie le prcdant( pas de echo, balise html...),
PHP vous le rappellera le cas chant,
2 Rcupration des donnes du POST ou GET. Les
variables globales et mthodes suivantes seront
vos amies : $ _ REQUEST, le _ get _ contents(),
etc.,
3 Les donnes seront traites si besoin, pour na -
lement correspondre au format de sortie voulu. Par
Listing 13. Tableau PHP au format JSON
<?php
$arrayPHP = array ( "attribut _ 1"=>"valeur _ 1",
"attribut _ 2"=>"valeur _ 2");
$arrayJSON = array ("nomObjet" => $arrayPHP) ;
$reponse = json _ encode($arrayJSON) ;
echo $reponse ;
?>
Listing 14. Rponse PHP au format XML
<?php
header("Content-Type: text/xml; charset=utf-8");
header("Cache-Control: no-cache , private") ;
header("Pragma: no-cache") ;
$reponse = '<?xml version="1.0" encoding="utf-8"?>' ;
$reponse .= "<reponse><attribut _ 1>Bonjour</
attribut _ 1><attribut _ 2>foo</attribut _ 2></reponse>";
echo $reponse ;
?>
Listing 15. Rcupration en JavaScript au format XML
objXHR.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200 ){
if(this.responseXML != null ) {
var resultXML = this.responseXML ;
var rootXML = resultXML.rstChild ; //racine du
document xml
var attribut _ 1 = rootXML.getElementsByTagName
("attribut _ 1")[0].rstChild.nodeValue ;
document.getElementById("textAjax").innerHTML =
attribut _ 1 ;
} else return ;
}
}
Listing 16. ScriptProxy.php
<?php
header("Content-Type: text/xml; charset=utf-8");
header("Cache-Control: no-cache , private") ;
header("Pragma: no-cache") ;
readle("http://domainRss.com/infoRSS.xml"); // PROXY
?>
Listing 17. Extrait d'un ux RSS

<item>
<title> RSS</title>
<link>http://domain.net/index.htm</link>
<description>texte du ux RSS </description>
</item>

Listing 18. Traitement JavaScript du RSS


objXHR.onreadystatechange = function() {
if(this.readyState == 4 && this.status == 200 ){
if(this.responseXML != null ) {
var resultXML = this.responseXML ;
var lstItemRSS = resultXML.getElementsByTagNam
e("item") ;
for( i= 0 ; i < lstItemRSS.length ; i++){
var title = lstItemRSS[i].getElementsByTagName(
"title")[0].rstChild.nodeValue ;
var link = lstItemRSS[i].getElementsByTagName("
link")[0].rstChild.nodeValue ;
var out = title + " : " + link ;
traite (out) ; //la fonction qui traitera les
donnes pour afchage (manipulation du DOM )
}
} else return ;
}
}
10/2010 28
Dossier
exemple pour JSON, nous utiliserons la fonction
json _ encode().
4 criture de la rponse la suite du header, par
exemple <?php echo $reponse ; ?>.
Texte
Jusqu' prsent, le serveur a renvoy les rponses
sous forme de texte. Pour les scripts retournant ou trai-
tant du texte, il serait plus judicieux de recourir un
script CGI en Perl. Exemple simple est prsent dans
le Listing 10.
JSON
Dfinition succincte : JSON est du texte au formatage
convenu de donnes (nom/valeur) qui est extrmement
facile d'emploi pour JavaScript. JSON est la notation
objet de JavaScript. Il se prte l'valuation (eval) par
JavaScript. JSON est sans doute plus lger et aussi po-
lyvalent en terme de communication inter-application que
XML. Exemple format JSON est montr dans le Listing 11.
Le rsultat retourn est une chane de caractres,
elle sera dans l'attribut responseText.
On crit la fonction pour traiter la rponse dans la
fonction de callback lie onreadychange (voir Lis-
ting 12). On remarque l'emploi de la fonction eval()
pour retourner l'objet dcrit dans responseText.
Avantages et inconvnients
Le format JSON est un moyen simple d'changer des
donnes tout en s'affranchissant du langage.
Les spcifications JSON, sont prisent en compte par
PHP grce aux fonctions natives json_*.
En revanche, en fonction de la version de PHP, on
peut tre oblig de passer par des bibliothques tier-
ces, celles-ci peuvent ne pas tre disponibles sur le
serveur, ou bien encore, le serveur n'autorise pas de
sortie JSON. Format JSON PHP avec json_encode(),
json_decode() et json_last_error()
Soit un tableau array() PHP prsent dans le Lis-
ting 13.
$reponse correspond l'objet JSON dfinit pr-
cdemment. La fonction rciproque json_decode(),
transforme un objet JSON en un tableau PHP. On
aura intrt vrifier que le format JSON est correct
en testant la dernire valeur de retour de json_last_
error(). Par exemple, cette vrification se fera avant
echo de la rponse et juste aprs json_encode() :
if (json_last_error() != JSON_ERROR_NONE )//
traiter l'erreur
return; else echo $reponse ;
XML
Dfinition succincte : le format XML devient un stan-
dard de fait dans la plupart des changes de donnes.
Ce format bien que rigoureux et verbeux, reste lisible
l'humain et permet de hirarchiser les donnes par-
fois issues de systme complexe. De plus, rien n'em-
pche de convertir ensuite les donnes XML en JSON,
dans ce cas il faudra rcuprer le XML sous format tex-
te dans responseText. Exemple, la rponse du serveur
est prsent dans le Listing 14. On rcupre dans la
fonction de callback la rponse XML (voir Listing 15).
Avantages et inconvnients
On remarque que le code peut devenir vite touffu, mais
il peut se factoriser dans une boucle, ou bien tre d-
plac dans une fonction ddie. Il existe aussi, des so-
lutions avec des frameworks qui pourront allger l'cri-
ture. Le traitement ncessite de connatre parfaitement
la structure du fichier xml reu. Dans le cas contraire, il
faut rendre un peu plus abstrait ou gnrique le code au
risque de le rendre moins comprhensible.
par exemple :
var attribut _ 1 = rootXML.getElementsByTagNa
me("attribut _ 1")[0].rstChild.nodeValue ;
peut tre remplac par son quivalent :
var attribut _ 1 = rootXML.childNodes[0].
rstChild.nodeValue ;
On note la disparition explicite du nom de l'attribut.
RSS exemple d'application XML
Dfinition succincte : RSS (RDF Site Summary) est un
fichier de syndication sous format xml et qui contient
des informations complmentaires de descriptions de
la source. Nous avons deux parties, les mtadonnes
(description du channel) et le contenu (l'info qui nous
intresse).
Comme le flux RSS ne se trouve pas sur le mme
serveur en gnral, nous allons utiliser le script appel
sur le serveur comme proxy. Exemple scriptProxy.
php sur le serveur ( appel par open()) (voir Lis-
ting 16).
L'appel se fait comme une fonction GET :
objXHR.open('GET', 'http://www.domainservice.
net/scriptProxy.php', true) ; objXHR.
send(null) ;
Le flux RSS comprend une succession d'informa-
tions sur le modle en extrait du Listing 17.
La rponse est traite en XML : resultXML.getEl
ementsByTagName("item") ; retourne une liste des
items du flux (voir Listing 18).
Exemple complet
Un exemple d'agenda simple. On utilise la base de don-
nes SQLite, qui peut servir de SGBD intermdiaire, el-
Ajax et PHP
www.phpsolmag.org 29
Listing 19. Exemple complet AJAX
Fichier index _ xhr.php
<?php
echo "<div>";
echo "<select id='nom'>
<option>Hochon</option>
<option>Tatareau</option>
</select>" ;
echo "</div>" ;
echo '<img id="anim" src="anim.gif" width="16"
height="16">';
echo "<span id='contactClient'>&nbsp;</span>";
?>
<script type="text/javascript" >
window.onload = quelNom ;
document.getElementById('nom').onclick = quelNom ;
function creationXHR() {
var resultat=null;
try {
var xmlHttpReq = new XMLHttpRequest();
}
catch(err) {}
if(window.XMLHttpRequest){
var xmlHttpReq = new XMLHttpRequest();
if (xmlHttpReq.overrideMimeType){
xmlHttpReq.overrideMimeType("text/xml");
}
return xmlHttpReq;
} else if (window.ActiveXObject) {
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (err) {}
try {
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (err) {}
}
throw new Error("Impossible de crer
l'objet"+"XMLHttpRequest pour le navigateur.");
}
function quelNom() {
objetXHR = creationXHR();
var parametres = new Array() ;
var quelNom = document.getElementById('nom').
options[document.getElementById('nom').selectedIndex].
text ;
var nocachetime = new Date().getTime();
parametres.push("nom=") ;
parametres.push(quelNom) ;
parametres.push("&nocache=") ;
parametres.push(nocachetime) ;
var params = parametres.join("") ;
objetXHR.open("get","test _ mysqlite.php?"+params, true);
document.getElementById('anim').style.
visibility="visible" ;
objetXHR.onreadystatechange = actualiserClient ;
objetXHR.send(null);
}
function actualiserClient(){
if(objetXHR.readyState == 4){
if(objetXHR.status == 200) {
var clientXML = objetXHR.responseXML ;
var rootClientXML = clientXML.rstChild ;
var nom = rootClientXML.getElementsByTagName("nom")[
0].rstChild.nodeValue ;
var prenom = rootClientXML.getElementsByTagName("pr
enom")[0].rstChild.nodeValue ;
var telephone = rootClientXML.getElementsByTagName(
"telephone")[0].rstChild.nodeValue ;
document.getElementById('anim').style.
visibility="hidden" ;
document.getElementById("contactClient").innerHTML =
nom + ' ' + prenom + ' ' + telephone ;
}
else
{
var erreurXHRstatus = objetXHR.status;
var erreurXHRstatusText = objetXHR.statusText;
objetXHR.abort() ;
objetXHR=null;
}
}
}
</script>
chier test _ mysqlite.php
<?php
header("Content-Type: text/xml ; charset=utf-8") ;
header("Cache-Control: no-cache , private") ;
header("Pragma: no-cache") ;
echo '<?xml version="1.0" encoding="UTF-8"?>' ;
$dsn = 'sqlite:BaseTestSQLite' ;
$user = '' ;
$pass = '' ;
try{
$dbh = new PDO($dsn) ;
}
catch (PDOException $e)
{
die ( 'Erreur ! : '.$e->getMessage() ) ;
}
if (isset($ _ GET['nom']) && trim($ _ GET['nom'])!=
"" ) {
$nom = strtoupper( $ _ GET['nom']) ;
$sql = "SELECT * FROM client WHERE nom LIKE :
nom ORDER BY nom " ;
$sth = $dbh->prepare($sql, array(PDO::ATTR _
CURSOR => PDO::CURSOR _ FWDONLY) );
$sth->execute(array(':nom' => $nom));
$XML = new XMLWriter();
$XML->openMemory();
while($row = $sth->fetchObject() ){
$XML->startElement("client");
$XML->writeElement("nom",
$row->nom);
$XML->writeElement("prenom",
$row->prenom);
$XML->writeElement("telephone"
, $row->tel);
$XML->endElement();
}
echo $XML->outputMemory();
}
else echo 'Demande impossible.';
$dbh = NULL ;
?>
Listing 20. Mise en place de AJAX avec JQuery
$("#success").load("script.php",{ 'nom[]': ["Adam", "Eve"]
}, function(response, status, xhr) {
if (status = = "success") {
var msg = "resultat OK !";
$("#result").html(msg);
}
});
//JQuery laisse la possibilit d'une programmation
complte d' AJAX .
$.ajax({
type: POST",
url: "script.php",
data: "prenom=John&nom=Resing",
success: function(msg){
$("#result").html(msg);
}
});
10/2010 30
Dossier
le est trs lgre et elle est constitue d'un seul fichier.
Son accs se fait par PDO et nous permet de revoir
la requte paramtre. On suppose que la liste drou-
lante des noms clients est alimente par une demande
SQL de PHP. Quand le nom est slectionn, la requte
AJAX appelle un script php qui retourne en XML le nom,
prnom et numro de tlphone du client.
La demande XMLHttpRequest se fait par une requte
GET et les paramtres sont passs par URL. La rpon-
se est XML en utilisant les fonctions de XMLWriter().
Le Javascript dcode le XML par le DOM.
La table client est cre par:
CREATE TABLE "client" ("id" INTEGER PRIMARY
KEY NOT NULL , "prenom" VARCHAR, "nom"
VARCHAR, "tel" VARCHAR)
On peut utiliser le plugin SQLite Manager pour Firefox
pour construire et alimenter la base pour les tests. La
base est constitue d'un seul fichier que l'on placera de
faon pouvoir tre accd par PHP.
Mise au point et analyse dans Firefox
avec Firebug 1.5.4
Firefox est un formidable outil de dbogage. Il possde
plusieurs plugins, dont certains trs performants : 'Web
developper' , 'Firebug' et IETab 2 pour muler Internet
Explorer dans Firefox 3.6. Onglet Console pour voir
Header et Response de la page avec Firebug. Firebug
possde un onglet en-ttes qui permet de visualiser les
en-ttes de rponse et de requte. Il est intressant de
noter le Content-Type du type de donne accepte par
la requte et de voir videmment que XMLHttpRequest
a fonctionn.
Utilisation l'onglet DOM pour observer le comporte-
ment de l'objetXHR
On retrouve tous nos amis de AJAX, un objet
objetXHR qui instancie XMLHttpRequest, puis les dif-
frents tats et rponses : readyState=4 du traitement
termin, la responseText et son contenu, responseXML
null, le status 200 du serveur avec le texte OK. Il est
vident que cette fonctionnalit est trs pratique, sur-
tout pour visualiser les erreurs et tats de ressources
demandes.
L'onglet rseau (voir Figure 7) permet d'obtenir le
statut de la requte (ici GET) avec 200 OK, son temps
d'excution (2,13s) et ses paramtres mois et no-ca-
che. En plus la slection par le bouton XHR trie les ap-
pels AJAX uniquement!
Profilage pour les temps d'accs et nombres d'appel
des mthodes
On peut avoir un profilage plus prcis encore, avec le
bouton console et profiler (voir Figure 8). On peut lire
que la fonction callback actualiserPage t appele
5 fois.
Examen des CSS
Pour finaliser l'examen AJAX, la structure du docu-
ment ainsi que son CSS peut tre value et modifie
in-situ. L'tat des choses ne sera pas persistant sur le
serveur, c'est uniquement sur le navigateur ! On peut
obtenir le script CSS en cours avec l'onglet CSS, (voir
Figure 9), nous avons les onglets CSS, style calcul
(c'est--dire aprs le cascading). Les proprits sont
ditables et l'on peut observer l'effet des modifications
sur la page.
Note :
A partir du JavaScript, on peut crire des lignes d'in-
formation ou de dbogage dans la console :
console.log("debogage: %s!", erreur1);
Figure 5. Lecture des en ttes sur client
Figure 6. Observation de objetXHR
Ajax et PHP
www.phpsolmag.org 31
L'objet console supporte d'autres fonctions puissantes
comme les assertions avec console.assert(). L'on-
glet script permet d'intervenir sur le JavaScript avec
des points d'arrt et des valeurs suivre appeles Es-
pions.
La valeur 'Espions' recherche de document.
getElementById("pdate") donne en bleu input#pdate
(voir Figure 10).
Ce n'est qu'un maigre aperu de Firebug, qui est
une aide indispensable au dveloppement.
Un framework JavaScript : implmentation
avec Jquery. Prsentation et avantages
d'utiliser un framework Javascript
Un framework offre un cadre de travail scuris et per-
met de faon mthodique, de s'abstraire de certaines
contraintes rcurrentes de programmation. Cela favorise
la concentration sur les parties rellement fonctionnelles
du code et facilite la maintenance de ce dernier. Un fra-
mework permet gnralement une criture plus conci-
se du code dans un cadre dtermin en apportant des
fonctionnalits supplmentaires qui simplifient la tche
du dveloppeur. Toutefois, il est important de connatre
la faon de coder sans le framework, from scratch avec
JavaScript, car cela permet d'une part, de maitriser les
techniques mises en jeu, et d'autres part de remdier
des bugs, des dfaillances et limites du framework.
Parmi les problmes rencontrs, un framework peut
rsoudre :
L'implmentation de l'objet XMLHttpRequest dans
les diffrents navigateurs qui n'est pas homogne.
Nous avons vu les diffrents objets instancier pour
Firefox et Internet Explorer Microsoft qui sont XMLHtt-
pRequest et ActiveXObject. Le code est souvent re-
dondant pour l'exploration du DOM, par exemple de
nombreuse boucles sont ncessaires pour explorer
l'arbre DOM.
Exemple de la simplification
Parmi les mthodes remarquables de JQuery :
.load( url, [ data ], [ complete(responseText,
textStatus, XMLHttpRequest) ] )
Cette mthode va grer seule l'envoi par POST ou GET
en se basant sur le format du data. Si le data est un ob-
jet, alors la mthode sera POST sinon GET.
Exemple :
//En xHTML
<div id = "result" ></div>
Le script va tre appel de faon asynchrone, ce pas-
sage de paramtres oblige un POST, il n'y a pas de fonc-
tion de callback.
//javascript
$("#result").load("script.php", { 'nom[]':
["Adam", "Eve"] } );
Le script va tre appel de faon asynchrone, ce pas-
sage de paramtres oblige un POST, la fonction de call-
back est appele en fin de traitement et affiche le suc-
cs de l'appel AJAX.
Figure 7. Visualisation du statut et paramtres de l'URL
Figure 8. Utilisation du Proler
10/2010 32
Dossier
Ce qu'il ne faut pas faire et pourquoi
Les techniques aperues sont sduisantes et peuvent
peu de frais booster l'interactivit d'un site. Malgr ses
atouts, AJAX n'est pas la panace, il est mme contre-
indiqu dans certains cas de figure.
Ne pas utiliser l'asynchrone
Les appels asynchrones sont facilement ralisables
et l'on peut mme 'oublier' que l'on appelle un script de
cette faon. La fonction .load de JQuery peut avoir cet
inconvnient. Il peut tre ncessaire de synchroniser
des scripts, la contrainte existe lorsque ceux-ci doivent
tre excuts dans un ordre prcis. C'est le cas lorsque
un script dpend du rsultat d'un autre, ou lorsque des
accs une ressource sont critiques et doivent tre ver-
rouilles. Le fait qu'une mthode de callback est mise
en place, peut laisser dans l'ignorance l'utilisateur sur le
rsultat de la rponse. Au cas o la rponse tarde, l'uti-
lisateur peut continuer agir et modifier son environne-
ment et le retour du script appel ne pourrait plus tre en
adquation avec l'tat de la page l'instant zro.
Ne pas utiliser Ajax
On peut ne pas tre amen utiliser AJAX, si les na-
vigateurs sont trop vieux et ne supportent pas un Ja-
vaScript rcent a fortiori XMLHttpRequest. Un utilisa-
teur peut avoir dsactiv son interprteur JavaScript.
Cas un peu plus rare, les navigateurs en mode texte
pourraient avoir quelques difficults avec la modifica-
tion du DOM...
Des problmes de navigabilit
L'indexation des pages se font sur la page principale,
mais pas sur les contenus amens par AJAX. Les fonc-
tionnalits du navigateur 'prcdent, suivant' ne peu-
vent s'exercer sur le contenu dynamique, et ainsi pna-
liser l'utilisateur.
Des surcharges de maintenance et complexit
du code
La course sans cesse a une meilleur ergonomie, inte-
ractivit avec le serveur, un SGBD, et une surenchre
de fonctionnalits desktop-like, peut a contrario, sur-
charger le navigateur et le rseau.
La maintenance du code peut devenir problmati-
que et des conflits peuvent apparatre si on utilise plu-
sieurs frameworks, engendrant des bugs difficilement
dtectables, surtout en mode asynchrone.
Dans le cas de plusieurs objets asynchrones, les
problmatiques d'accs concurrentiel et de gestion des
ressources complexifieront les tches d'criture, de
tests et de dbogages.
La nature mme d' AJAX, un ensemble de technolo-
gies, devrait interpeller le dveloppeur sur la ncessit
de sparer les scripts de natures diffrentes, d'utiliser
si possible un modle MVC, et d'avoir une approche
pragmatique de son emploi certes ncessaire, mais pas
toujours adquat.
Avenir
AJAX est une conception et une articulation autour
d'un objet XMLHttpRequest. L'volution de cet ensem-
ble sera la rsultante de l'volution et de la cohren-
ce de ses composants. DOM et CSS continuent leurs
progressions au rythme des recommandations du
W3C, l'intgration de HTML 5 est en route. Les fonc-
tions de timing, le retour d'objet BLOB, ainsi que l'int-
gration du cross-domain, dans de nouveau objet com-
me XDomainRequest de Microsoft ou bien la nouvelle
XMLHttpRequest 2, permettront de franchir nativement
ces barrires.
Figure 9. Visualisation du CSS
Figure 10. Dbogueur du JavaScript
Ajax et PHP
www.phpsolmag.org 33
JEAN TATAREAU
Diplm en ingnierie et qualit du logiciel au CNAM de Bordeaux,
l'auteur s' intresse la programmation et la ralisation logiciel-
le depuis de nombreuses annes. Depuis plus de deux ans, il a cr
et dirige la socit Kiwi Engineering. Les domaines de prdilection
sont le travail faon d'applicatifs pour le professionnel ou le parti-
culier au travers d'interfaces Web.
Contact http://www.kiwi-engineering.net.
Sur Internet
http://www.adaptivepath.com/ideas/essays/archives/000385.php Article de rfrence,
http://ajax.developpez.com/ Site d'information sur le developpement Ajax entre autres,
http://www.w3.org/TR/XMLHttpRequest/ W3C du XMLHttpRequest,
http://fr.php.net/manual/fr/book.simplexml.php PHP : simplexml,
http://fr.php.net/manual/fr/book.json.php PHP : JSON,
http://tools.ietf.org/html/rfc4627 Mmo sur JSON,
http://msdn.microsoft.com/en-us/library/ms535874%28v=VS.85%29.aspx XMLHttpRequest Object,
http://msdn.microsoft.com/en-us/library/cc288060%28v=VS.85%29.aspx XDomainRequest Object,
https://developer.mozilla.org/en/XmlHttpRequest XMLHttpRequest de Mozilla,
http://code.google.com/p/sqlite-manager/ plugin Mozilla.
La Figure 12 dattraction BLOB (BAG blob attract
graph), montre lvolution suggestive de XMLHttpRe-
quest vers XMLHttpRequest version 2. L'objet asyn-
chrone appel XHR devient un attracteur plus orien-
t cross-domain, ce qui nous amne redfinir AJAX
en crossAJAX. Le cross-domain est maintenant natif
AJAX, ce qui correspond la demande de croissante
de nouveaux services externes et technologies distan-
tes (Yahoo, Google, Amazon, Twitter). Par cette modi-
fication de conformit, l'attraction des autres technolo-
gies, telles que CSS 3 et HTML 5 forment autour de
JavaScript une plus grande cohsion.
Pour HTML 5, l'intgration audio-vido simple et ro-
buste, contrle de formulaire, drag and drop, gestion de
Figure 12. Graphe d'attraction BLOB
l'historique ne sont plus des rles dvolus ou de faon
moindre Javascript. Pour CSS 3, graphisme sophis-
tiqu et une interaction accrue avec le DOM. L'criture
du code devient plus rigoureuse et cela ne peut qu'am-
liorer la prcision et la concision des pages ainsi que
leurs robustesses.
D'autres part, ces dernires prennent leurs char-
ges des tches qui auparavant taient dvolues Ja-
vaScript. On peut voir, sur le schma un nouvel quilibre
qui renforce la robustesse de l'application dans la r-
partition volumtrique de ses rles propres. En ce sens
crossAJAX l'instar de AJAX de l'avenir, s'il dlaisse
un peu les rles de widgets-gadgets que l'on lui fait tenir
trop souvent. Note : le BAG (blob attract graph) est un
concept graphique intuitif et suggestif dvelopp chez
Kiwi-Engineering, de l'expression d'ides reposant sur
l'attractivit rpulsion, compression extension de
ses constituants.
Conclusion
L'augmentation des dbits Internet et de la diversit
d'applications sur PC mais aussi de diffrents terminaux,
mobiles, tablettes, assurent la prsence incontournable
d' AJAX. En revanche la prennit d'une solution infor-
matique est un leurre, celle-ci doit tre adapte, avec
pragmatisme, la problmatique prsente.
AJAX et le langage de l'lphant peuvent faire bon
mnage et cela de manire lgante. Cette interaction
dynamique entre les deux mondes du serveur et du
client peuvent donner l'illusion d'une communication in-
ter-langage, une alchimie qui dcuple la puissance de
l'ensemble en s'appuyant sur les points forts respectifs
de l'un et de l'autre.
10/2010 34
Pratique
N
ous travaillerons ici sur un serveur Debian 5.0
Lenny install sans aucun logiciel supplmen-
taire.
Installation et configuration de lAMP,
le serveur web
Qui dit hbergement de site, dit serveur web. Nous reste-
rons sur le plus utilis au monde, Apache. Pour cela nous
utiliserons la commande aptitude qui gre les paquets de
Debian aptitude install apache2. Normalement si
vous affichez lIP de votre machine sur un navigateur vous
devriez avoir la mythique page It works !.
Le serveur MySQL et PHP
Maintenant nous allons nous attaquer PHP et MySQL.
aptitude install php5 php5-mysql mysql-server
mysql-client mysql-common
Il peut vous demander un mot de passe pour mysql,
nous vous conseillons de mettre un mot de passe dif-
frent de celui du systme. Il faut redmarrer apache
pour que les modifications soient prises en compte.
/etc/init.d/apache2 restart
Maintenant vous avez un serveur web avec PHP
et MySQL dinstalls. Pour vrifier que tout fonctionne
nous allons crer un fichier de visualisation de la confi-
guration de PHP. En CLI, tapez : nano /var/www/index.
php. Coller le contenu du Listing 1. Faites ensuite Ctrl X
puis O (Y pour les Debian anglaises).
Rendez-vous dans votre navigateur ladresse sui-
vante : http://IPS/index.php. Rappelons le, le rpertoire
par dfaut dapache est /var/www/. Vous devriez trouvez
Crer
son propre hbergement
Nous verrons dans cet article comment crer un serveur
dhbergement web avec un minimum de scurit.
Dans une premire partie nous installerons/configurerons
un AMP (Apache + MySQL + PHP), puis nous installerons
des logiciels tierces pour les serveurs FTP, DNS, etc.
Cet article explique :
Installer et congurer un serveur Web (Apache, MySQL, PHP).
Installer et congurer des services dhbergement (FTP, DNS).
Installer et congurer les utilitaires (phpMyAdmin).
Mettre un minimum de scurit.
Crer un compte utilisateur.
La lgislation et lhbergement web.
Ce qu'il faut savoir :
Utiliser la ligne de commande en console dun linux (debian
ou pas).
Nous admettrons que IPS reprsente lIP du serveur o vous
installez votre serveur dhbergements de site (127.0.0.1 pour
une installation sur le poste local).
Figure 1. Rsultat dun phpinfo()
Hbergement web
www.phpsolmag.org 35
cette page. Si ce nest pas le cas, cest que tout ne sest
pas install correctement. Dans ce cas, redmarrez apa-
che2 et ressayez, si cela ne fonctionne toujours pas re-
commencez les aptitudes.
Conclusion
Vous disposez ds prsent dun serveur apache avec
PHP/MySQL.
Installation des services dhbergements
Nous verrons ici comment installer les services mini-
mums lis lhbergement de sites web.
Le serveur FTP
Dans le cas dun hbergement, il est en gnral plus in-
tressant de proposer un protocole de dpt de fichier
tel que le FTP. Personnellement je prfre proftpd, mais
il en existe de nombreux autres.
Commenons par linstaller : aptitude install
proftpd. Il vous demandera de slectionner le mo-
de dutilisation, il y a 2 cas de gure :
Vous pensez accueillir peu de monde, juste pour un
hbergement semi personnel alors il est conseill
de slectionner inetd qui consommera beaucoup
moins de ressources.
Vous allez faire un vrai hbergement sur internet
pour hberger toute la toile (cest viser un peu haut
mais qui sait) alors slectionner standalone qui as-
sure un trs grand dbit.
Notez que nous pouvons tout moment changer ce
paramtre dans le fichier de configuration de proftpd.
Nous allons maintenant modifier un peu la configura-
tion, ouvrez le fichier proftpd :
nano /etc/proftpd/proftpd.conf
Ligne 14 : ServerName LE-
NOMDEVOTRESERVEUR
Ligne 33 : retirer le # devant DefaultRoot
~
Enregistrer et quitter le fichier. Si vous avez mis une ins-
tallation en standalone tapez la commande /etc/init.
d/proftpd restart.
Le paramtre DefaultRoot permet de bloquer lutili-
sateur dans son dossier client, en effet sans ce para-
mtre activ il pourrait voyager dans tout le disque dur
du serveur (ou les permissions systme le permettent).
Vous avez un serveur FTP fonctionnel !
Le serveur DNS
Tout dabord quest-ce quun serveur DNS (Domain
Name Server) ? Cest un serveur qui convertit un nom
en une IP. Il peut savrer utile pour hberger des sites
Listing 1. Fichier index.php
<?php
phpinfo();
?>
Listing 2. Fichier DNS named.conf
zone "mondomaine.fr" IN {
type master;
le "/etc/bind/db.mondomaine.fr";
};
Listing 3. Fichier de zone DNS
$TTL 86400
@ IN SOA mondomaine.fr. monadresse.email.fr. (
2010090501; Numro de srie sous la forme AAAAMMJJNN
28800; Temps de rafraichissement
7200 ; Temps avant nouvel essai
864000 ; Temps d'expiration
86400 ; Min TTL
)
NS premier.dns.fr.
NS second.dns.com.
mondomaine.fr. A 123.456.789.123
monsousdomaine CNAME mondomaine.fr.
Listing 4. Fichier portsentry.conf
ADVANCED

PORTS

TCP="1024" # Valeur du port maximum


utiliser en mode avance en TCP
ADVANCED

PORTS

UDP="1024"# Valeur du port maximum


utiliser en mode avance en UDP
ADVANCED

EXCLUDE

TCP="113,139"# On exclue ces ports


du TCP
ADVANCED

EXCLUDE

UDP="520,138,137,67"#On exclue ces ports


de l'UDP
IGNORE

FILE="/etc/portsentry/portsentry.ignore" #Fichier
des IPs ignores
HISTORY

FILE="/var/lib/portsentry/portsentry.history" #
Le chier de logs
BLOCKED

FILE="/var/lib/portsentry/portsentry.blocked" #
Le chier des utilisateurs bloqus
RESOLVE

HOST = "0" # on dsactive la rsolution d'host


(charge systme)
BLOCK

UDP="1"# on active le blocage de l'UDP


BLOCK

TCP="1"# Blocage du TCP


KILL

ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j


DROP" # Commande de blocage de l'attaquant ($TARGET$)
reprsente l'IP.
SCAN

TRIGGER="0" # Nombre de tentative tolr


Listing 5. Fichier portsentry
TCP

MODE="atcp"
UDP

MODE="audp"
Listing 6. Extrait lter.d
[Denition]
failregex = \(\S+\[<HOST>\]\)[: -]+ Maximum login
attempts \(\d+\) exceeded$ #LE fail regex contient
toutes les regex des attaque possible, <HOST>
reprsente l'IP dans la chaine.
ignoreregex = # On peut ignorer certaine regex
prcise, si ce n'est pas le cas (souvent) on laisse
vide.
Listing 7. Extrait jail.conf
[ssh]
enabled = true # Activ
port = ssh # Port bloquer
lter = sshd # nom du ltre (correspondant au nom du
chier dans lter.d)
logpath = /var/log/auth.log #Fichier de log
maxretry = 2 # Nombre de tentative maximum
10/2010 36
Pratique
expliquer le fonctionnement dun serveur mail. Vous
trouverez la fin de cet article un lien contenant une
installation trs dtaille dun serveur mail et de toute
sa scurit.
aptitude install postx
Slectionnez Site Internet, en nom de serveur votre-
nomdedomaine.fr. Par dfaut un serveur postfix nen-
voie que des emails provenant exclusivement de local-
host, donc pas de configuration faire du ct de la
configuration gnrale.
Conclusion
Vous venez dinstaller le ncessaire pour procder un h-
bergement mutualis, vos utilisateurs peuvent se connec-
ter en FTP, vous avez votre propre serveur de DNS et un
serveur mail pour lenvoi des e-mails depuis PHP.
Installation des utilitaires
Nous allons maintenant installer des petits utilitaires
pour vous aider grer votre plateforme.
phpMyAdmin
phpMyAdmin est une application PHP permettant de
grer les bases de donnes MySQL. Pour linstaller
nous allons utiliser comme notre habitude aptitude,
cependant sachez que vous pouvez linstaller en le t-
lchargeant directement sur le site officiel de phpMyAd-
min cest une simple archive dcompresser dans un
dossier web.
aptitude install phpmyadmin
Dans linstallation slectionner apache2, une fois lins-
tallation termine il faut recharger la configuration dapa-
che via la commande /etc/init.d/apache2 reload.
Maintenant rendez-vous sur http://IPS/phpmyadmin/
et connectez-vous via lidentifiant root et le mot de pas-
se mis dans linstallation.
Logwatch
Logwatch est un programme qui vous envoie tous les
matins un rcapitulatif analys de vos logs serveurs.
Par exemple pour apache vous recevrez toutes les
adresses retournes en erreur ou mme des tentatives
de piratages via des injections, il affiche aussi toutes les
connexions proftpd et ssh avec leur IP.
aptitude install logwatch
Nous allons modifier le fichier de configuration pour quil
envoie son e-mail notre boite e-mail.
nano /usr/share/logwatch/default.conf/
logwatch.conf
moins que vous ne souhaitiez donner comme url vos
membres votre IPS. Je nen connais que 2, le plus r-
pandu est sans nul doute BIND assez simple de confi-
guration. Cest celui que nous utiliserons ici, sinon il y a
mydns qui lui utilise MySQL pour les enregistrements
(vite la cration de fichier de zone que nous allons voir
par la suite). Nous ne verrons que le cas o le serveur
est DNS primaire puisquen gnral on utilise des ser-
veurs secondaires fournis par un prestataire.
Commenons par linstaller : aptitude install
bind9 (Note : Il se peut que ce dernier soit dj ins-
tall sur votre systme auquel cas il ninstallera rien, ce
nest pas un problme). Donc pour configurer les DNS
de nos futurs domaines nous allons avoir besoin de mo-
difier la configuration principale du serveur DNS et de
crer le fichier de zone. Modifier le fichier /etc/bind/na-
med.conf nano /etc/bind/named.conf. Allez en bas du
fichier et ajouter le texte du Listing 2.
Quitter nano en enregistrant votre fichier. Maintenant
nous allons crer le fichier de zone du domaine : nano /
etc/bind/db.mondomaine.fr. Quitter nano en enregistrant
votre fichier. Maintenant il faut recharger la configuration
de bind : pour cela taper /etc/init.d/bind9 reload.
Pour vrifier que votre serveur est bien configur je vous
invite effectuer un zone check via http://www.zone-
check.fr/demo/. Pour cela renseignez en zone votre nom
de domaine et en DNS vos serveurs DNS. Vous pouvez
voir un exemple de fichier de zone dans le listing 3.
Le serveur Mail
Nous verrons ici une configuration trs basique dun
serveur e-mail puisque nous allons lutiliser uniquement
pour lenvoi de-mail. Il faudrait un article complet pour
Listing 8. Excution de la commande ad duser
ns:~# adduser pseudo
Adding user 'pseudo' ...
Adding new group 'pseudo' (1000) ...
Adding new user 'at' (1000) with group 'pseudo' ...
Creating home directory '/home/pseudo' ...
Copying les from '/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for pseudo
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
Listing 9. Fichier de vhost d'apache
<VirtualHost *:80>
DocumentRoot /home/pseudo/
ServerName pseudo.domaine.fr
<Location />
php

admin

valueopen

basedir /home/pseudo/
php

admin

valueupload

tmp

dir "/home/pseudo/mtmp/"
</Location>
</VirtualHost>
Hbergement web
www.phpsolmag.org 37
Ligne 44 : MailTo = root remplac le par
MailTo = monadresse@email.fr
Enregistrer et quitter.
La scurit dun hbergeur, le pare-feu
La premire scurit dun serveur rside dans son pa-
re-feu. Je vous conseille dutiliser iptables pour le confi-
gurer. Rappelons-le iptables nest pas le pare-feu de
linux mais juste lutilitaire pour le configurer. Le pare-feu
contenu dans le kernel sappelle netfilter.
Je ne ferai pas une configuration complte dun pa-
re-feu (il en existe beaucoup sur la toile), mais juste une
explication simple. Iptables est constitu selon 3 tables
(on peut en ajouter dautre) :
INPUT, cest le trac entrant.
OUTPUT, cest le trac sortant.
FORWARD, cest le trac quon transfre.
Le fonctionnement est trs simple : il applique toutes les
rgles de ses tables en fonction des paquets en transit
sil y a une rgle lui correspondant, il applique ce quon
lui a demand. Dans le cas contraire il prend ce quon
appelle la POLICY de la table et applique lordre.
Les mise jours systmes et logiciels
Nous allons ici aborder laspect scuritaire dun hber-
gement web. Tout dabord il faut mettre jour quotidien-
nement son serveur via ses 2 commandes :
aptitude update
aptitude safe-upgrade
En cas de changement de kernel pensez redmarrer
le serveur.
En cas dinstallations faites en dehors de la commande
aptitude, phpMyAdmin par exemple, pensez vrifier les
nouvelles versions, et de surtout mettre jour si une nou-
velle version est annonce. Pour parler pratique, 200 ser-
veurs se sont fait stopper le 10/08/2010 chez le fournisseur
de serveur la hche pour une attaque phpMyAdmin.
Portsentry
Nous allons maintenant voir portsentry qui est un utili-
taire danti scan de port.
aptitude install portsentry
Modifier la configuration en ouvrant /etc/portsentry/
portsentry.conf et placez y le contenu.
Maintenant mettez le contenu du listing 5 dans le fichier
de configuration du mode par dfault de portsentry :
/etc/default/portsentry
/etc/init.d/portsentry restart
Vous remarquerez que lon ne fait quajouter un a dans
les modes, pourquoi ? Car on le met en mode avanc,
ce qui nous permet un scan de tous les ports inutilis
jusqu 1024.
Fail2ban
Fail2ban est un programme qui permet de bannir un
utilisateur aprs un certain nombre dessai de mots de
passe errons.
aptitude install fail2ban
Maintenant rendons nous dans /etc/fail2ban/. Vous y
trouverez deux fichiers et deux dossiers.
action.d : Ce dossier contient tous les chiers de
conguration des actions faire pour bannir/en -
voyer un email lorsque une attaque est dtecte.
lter.d : Ce dossier contient toutes les rgles de d-
tection sous le format du Listing 6.
fail2ban.conf : Ce chier contient la conguration
du programme, Il y a 3 paramtres possible de
base :
o loglevel : De 1 4, 1 reprsentant le moins din-
formation, par dfaut je recommande 3.
o logtarget : Le chemin du chier de log des tenta -
tives dattaque bloque.
o socket : chemin du chier de socket.
jail.conf : Le chier jail.conf contient tous les pa-
ramtres des rgles (activation, chier de log,
tentative maximum, etc). Il est compos en 2 par-
ties :
o La premire est une conguration de base elle
commence par un [DEFAULT] on y trouve prin-
cipalement les paramtres suivants :
ignoreip : Liste des IPs ignorer, si vous tes
en IP xe ne pas hsiter lajouter car 3 es -
sais ou moins peuvent vite arriver.
bantime : Temps de bannissement par dfaut
dune IP en seconde.
maxretry : Nombre dessais maximum.
o La seconde (cf. Listing 7) est compose des pa-
ramtres de la premire partie quon modie (si
on veut utiliser les valeurs par dfaut on ne les
redni pas) et dautres paramtres.
Une fois vos rgles dtermines,il ne reste plus qu re-
dmarrer le service :
Terminologie
LAMP : Serveur compos de Linux, Apache, MySQL et Php.
Netlter : Le module du kernel linux qui sert de par feu
Iptables : Programme permettant dinteragir avec netlter
POLICY : Rgle par dfaut du par feu
10/2010 38
Pratique
ALEXANDRE BAZZET
Lauteur est tudiant en 3me anne SUPINFOet formateur STA Li-
nux ; fondateur dIce Groups association dinformatique et dIce He-
berg services dhbergement gratuit et payant.
/etc/init.d/fail2ban restart.
Le reste
Il existe normment de logiciels de scurit pouvant
contrer chacune des attaques de certain type, je vous
en conseille quelques autres :
rkhunter : un anti rookit puissant,
snort : un NIDS (non pas un nid doiseau mais un
dtecteur dintrusion),
kernel : Le kernel linux contient normment de s-
curit contre les attaques comme le syn cookie ou
encore le rp lter et bien dautres encore.
Conclusion
Vous laurez compris, la scurit dun hbergeur est
trs importante. En effet vous donnez accs votre ser-
veur des personnes, il est donc ncessaire de bien se
protger. Noubliez pas que plus vous installer de pro-
gramme, plus il y aura de failles potentielles sur votre
serveur.
Crer un compte utilisateur
Nous allons maintenant voir comment crer un compte
utilisateur pour hberger son site, pour cela nous allons
commencer par lui crer un compte utilisateur syst-
me : adduser pseudo.
En changeant bien sr le pseudo. Il va vous deman-
der plusieurs informations dabord le mot de passe du
compte confirmer, puis des informations comme le
numro de tlphone qui sont facultatives. Vous po-
uvez voir un exemple dans le Listing 8.
Maintenant que lutilisateur est cr il a accs son FTP.
Il faut maintenant crer son espace web pour cela nous
allons crer le fichier /etc/apache2/sites-available/pseudo
et y mettre le contenu du Listing 9.
mkdir /webuser/pseudo/mtmp/
a2ensite pseudo
/etc/init.d/apache2 reload
Si vous vous rendez sur http://pseudo.domaine.fr, vous
y trouverez votre site.
Pour crer une base de donnes il suffit de vous ren-
dre sur phpMyAdmin, de crer un utilisateur via longlet
privilge et de cocher loption Crer une base portant
son nom et donner cet utilisateur tous les privilges
sur cette base. Nous vous conseillons dadopter une
charte de nommage pour les bases de donnes SQL,
en effet phpMyAdmin range les bases de donnes par
numro, par exemple si il y a une base nomme pseu-
do_1 et une autre pseudo_2 il les regroupera sous
pseudo avec 2 dclinaison _1 et _2 comme reprsent
dans la Figure 2.
Conclusion
Lopen base dir permet dempcher lutilisateur, daller
dans dautres rpertoires que le sien ce qui garantit une
certaine scurit. Pour crer quelques utilisateurs cette
mthode vous conviendra, cependant en cas daffluen-
ce il faudrait penser en faire un petit script bash.
La lgislation et lhbergement web
Nous avons vu dans les prcdents chapitres tout ce
quil fallait savoir pour lancer un petit hbergement mu-
tualis. Cependant il ne faut pas sy prendre la lgre,
la lgislation franaise est assez claire pour ce genre
de cas.
Dj il faut savoir que vous devez sauvegarder une
anne de log. En effet vous devez tre capable diden-
tifier la personne qui aura dpos des fichiers sur votre
serveur, dans le cas contraire la justice pourra consid-
rer que cest vous qui les avait dposs. Hors pour sau-
vegarder de telles donnes vous devez faire une de-
mande la CNIL (gratuit et ralisable en 10 minutes sur
internet). De plus si vous faites des newsletters ou une
inscription demandant une information personnelle il
est aussi obligatoire de faire une dclaration la CNIL.
Vous pouvez dans certains cas tre dispens de dcla-
ration la CNIL pour vous renseigner, vous pouvez les
contacter au 01 53 73 22 22.
Figure 2. Rsultat dune charte de nommage dans phpMyAdmin
Sur Internet
http://www.rhien.org/ Le Rseau dHbergeurs Indpen-
dants et ENgags
http://www.starbridge.org/spip/spip.php?article12 Installer
un serveur mail gr par MySQL avec anti-virus, anti-spam,
blacklist, etc.
www.phpsolmag.org 39
Pour les dbutants
D
e nombreuses applications Web (forums, ga-
leries dimages, sites marchands, ) reposent
sur des bases de donnes. Linteraction avec la
base de donnes, la cration de la base et des tables,
la manipulation des donnes, ainsi que le contrle des
droits daccs aux donnes sont raliss avec le lan-
gage SQL.
Dans cette srie darticles sur SQL, vous allez appren-
dre les notions qui vous permettront de crer une base
de donnes et dajouter, consulter, modifier ou supprimer
des informations dans cette base. Vous verrez comment
communiquer avec elle via une console SQL, linterface
graphique PhpMyAdmin ou depuis un script PHP.
Pour appliquer ce que vous allez apprendre dans cet
article, il est ncessaire dinstaller un serveur de base
de donnes MySQL, de prfrence la version 5, un ser-
veur web avec PHP version 5 et le client graphique php-
MyAdmin. Les distributions XAMPP (Windows, Linux,
Mac OS), WAMP (Windows), EasyPHP (Windows) ou
MAMP (Mac OS) vous fourniront lenvironnement de
travail ncessaire pour communiquer avec MySQL
et crer des applications Web.
Larticle sera illustr par la cration dune base de
donnes trs simple concernant la gestion dune biblio-
thque prive.
Base de donnes
Une base de donnes est un ensemble structur din-
formations centralises ou rparties. Un ou plusieurs
utilisateurs, ou des programmes, peuvent manipuler les
donnes de la base en fonction des droits qui leur ont
t accords.
SGBD
Linteraction avec la base de donnes ainsi que la cra-
tion de la base sont ralises par un systme de ges-
tion de base de donnes (SGBD). Ce dernier est com-
pos de logiciels permettant :
la cration de la base, le choix du type de donnes,
la gestion des contraintes,
l'ajout, la suppression, la modication ou la consul -
tation des donnes,
la gestion des mots de passe et des privilges des
utilisateurs sur les donnes,
le partage des ressources en prenant en compte
les accs concurrents,
l'annulation de transactions,
la restauration de la base en cas de destruction
et la reprise automatique en cas d'incident.
Un des modles les plus rpandus de SGBD est le rela-
tionnel, introduit la fin des annes 1970 (Ingres, Ora-
cle, ). Dans ce modle, les donnes sont reprsen-
tes sous la forme de tables deux dimensions. Par
exemple, un auteur pourrait tre stock dans une ligne
d'une table nomme auteur, dont les colonnes repr-
senteraient les champs nom, prnom, date de naissan-
ce, etc... Cette table comporterait autant de lignes qu'il
y a d'auteurs distincts.
SQL :
langage de dfinition des donnes
Les bases de donnes sont trs utilises dans les applications
Web. La cration, linterrogation et la manipulation des
donnes de la base sont ralises en SQL. Dans cette srie
darticles vous apprendrez le langage SQL ainsi que les bases
ncessaires pour communiquer avec une base de donnes
partir dun script PHP.
Cet article explique :
Dnition d'une base de donnes.
Prsentation du langage SQL.
Cration de bases et de tables.
Gestion des contraintes.
Ce quil faut savoir :
Aucun prrequis.
10/2010 40
SQL
SQL
SQL (Structured Query Language) est le langage utilis
dans les bases de donnes relationnelles pour la ma-
nipulation des donnes, leur dfinition et le contrle de
laccs aux donnes. Cest un langage non procdural
issu du langage SEQUEL (Structured English Query
Language) dvelopp par IBM. SQL a t standardis en
1986 (ANSI SQL/86). Les versions SQL2 et SQL3 sont
des rvisions du standard SQL, datant respectivement
de 1992 et de 1999. SQL2008 est la dernire version de
la norme.
Les principaux SGBD relationnels du march res-
pectent le niveau Entry Level de la norme SQL2, cest--
dire quils implmentent lensemble minimum dinstruc-
tions dfinies dans la norme. Chaque SGBD propose
des fonctionnalits supplmentaires (fonctions, types
de donnes, ...).
Le langage SQL comporte plusieurs parties :
Le langage de dnition des donnes (LDD) permet
de dnir la structure de la base : cration, modi -
cation, suppression de tables ou de bases, ajout de
contraintes,
Le langage de contrle des donnes (LCD) permet
de dnir les privilges des utilisateurs sur les don -
nes,
Le langage de manipulation des donnes (LMD)
permet d'insrer des donnes dans la base, de les
extraire, de les modier ou de les supprimer.
Dans cet article, vous allez apprendre utiliser le LDD
et le LCD. Le LMD sera quant lui prsent dans les
prochains articles de cette srie ddie SQL.
MySQL
De nombreuses plateformes de dveloppement dappli-
cations Web reposent sur MySQL. Ce SGBD client/ser-
veur open source est distribu sous licence GPL et sous
licence commerciale. MySQL est simple dutilisation
et rapide. Il est disponible pour de nombreux systmes
dexploitation. Cest pourquoi les exemples qui vont illus-
trer cet article seront tous tests sous MySQL.
La communication avec un serveur de bases de don-
nes MySQL peut seffectuer depuis un client MySQL en
mode console, en utilisant le langage de requtes SQL,
ou en utilisant linterface graphique web phpMyAdmin
(Figure 1). Lutilisateur peut ainsi, depuis son naviga-
teur, envoyer des requtes MySQL sans avoir recours
au langage SQL. Les requtes sont automatiquement
cres par phpMyAdmin, partir des donnes saisies
et des actions effectues dans linterface. Il sera cepen-
dant toujours possible denvoyer des requtes la base
en utilisant la console SQL intgre de phpMyAdmin.
Vous apprendrez utiliser ces clients dans la der-
nire partie de larticle.
Cration de la base et des utilisateurs
La commande CREATE SCHEMA permet de crer une ba-
se de donnes. La marque de fin dinstruction est le ca-
ractre point-virgule.
CREATE SCHEMA nom_base;
Dans lexemple de cet article, la base contient les
donnes dune bibliothque. La base dont le nom est
biblio est cre par linstruction suivante :
CREATE SCHEMA biblio;
Figure 1. Client/Serveur
www.phpsolmag.org 41
Pour les dbutants
Par convention les mots rservs du langage (CREATE,
SCHEMA, ...) scrivent en majuscules et les mots dfinis
par lutilisateur en minuscules (biblio).
Une fois la base de donnes conue, il faut crer un
utilisateur et lui donner des droits afin quil puisse acc-
der la base. Il est important de donner des droits diff-
rents aux utilisateurs de la base pour la protger, assu-
rer la confidentialit des donnes et leur intgrit.
Pour accorder des droits, il faut suivre la syntaxe :
GRANT privilege1 [, privilege2, ...] ON objet
TO nom _ utilisateur1 [, nom _ utilisateur2,
...];
La liste des privilges peut comprendre SELECT, DELE-
TE, INSERT, UPDATE ou tous la fois (ALL PRIVILEGES).
Les crochets sont utiliss dans la syntaxe pour indiquer
les parties optionnelles de la commande. Les droits SE-
LECT, INSERT, UPDATE et DELETE permettent respecti-
vement de consulter, dajouter, de mettre jour ou de
supprimer des donnes. Ces privilges peuvent tre
accords en une seule commande un ou plusieurs
utilisateurs sur un objet (une ou plusieurs tables).
Dans MySQL, il est possible de crer un utilisateur
et de lui donner des privilges dans la mme comman-
de. Les instructions suivantes donnent lutilisateur
lecteur le droit de lecture sur la table livre de la base
Tableau 1. Dirents types de donnes proposs par MySQL
Classe Type Description
Numrique (entiers) TINYINT Permet de stocker 2^8 nombres
SMALLINT Permet de stocker 2^16 nombres
MEDIUMINT Permet de stocker 2^24 nombres
INTEGER Permet de stocker 2^32 nombres
Numrique (rels) FLOAT Nombre virgule ottante stock sur 4 octets
DOUBLE, REAL Nombre virgule ottante stock sur 8 octets
DECIMAL(M,D) DECIMAL(5,2) stocke un nombre virgule fxe comportant 5 chifres
dont 2 dcimaux
Chane de caractres CHAR(n) CHAR(8) stocke une chane de longueur xe sur 8 caractres
VARCHAR(n) VARCHAR(25) stocke une chane de longueur variable et de maximum
25 caractres
TINYTEXT Permet de stocker 2^8 caractres
TEXT Permet de stocker 2^16 caractres
MEDIUMTEXT Permet de stocker 2^24 caractres
LONGTEXT Permet de stocker 2^32 caractres
Binaire TINYBLOB Permet de stocker 2^8 caractres en objet binaire
BLOB Permet de stocker 2^16 caractres en objet binaire
MEDIUMBLOB Permet de stocker 2^24 caractres en objet binaire
LONGBLOB Permet de stocker 2^32 caractres en objet binaire
Liste de chanes ENUM(val1, val2, ...) Le champ prend 0 ou une valeur parmi la liste propose
SET(val1, val2, ...) Le champ peut prendre 0, une ou plusieurs valeurs de la liste propose
Date et temps DATE 2010-10-23
DATETIME 2010-10-23 09:14:05
YEAR 2010
TIME 09:14:05
TIMESTAMP 1287818045
Tableau 2. Structure de la table ZONE
Colonne Type de donnes Description
code_zone chane Cl primaire, identiant de la zone compos de la premire lettre de la pice suivi du nu-
mro de ltagre
piece chane Nom de la pice dans laquelle se situe le livre
meuble chane Description du meuble dans lequel se situe le livre
10/2010 42
SQL
biblio et tous les droits au bibliothcaire sur toutes les
tables (caractre *) de la base biblio.
GRANT SELECT ON biblio.livre TO lecteur IDEN-
TIFIED BY motdepasse1;
GRANT ALL PRIVILEGES ON biblio.* TO biblio-
thecaire IDENTIFIED BY motdepasse2;
Il est possible de supprimer ultrieurement des privil-
ges avec la commande REVOKE :
REVOKE privilege1 [, privilege2, ...] ON objet
FROM nom _ utilisateur;
Type de donnes
Les valeurs des colonnes dune table sont dfinies sur
un domaine. La norme SQL dfinit quatre grandes clas-
ses de types de donnes : les numriques, les chanes
de caractres, les binaires et les dates. Les diffrents
SGBD du march proposent un sous-ensemble stan-
dard de types de donnes ainsi que des types spcifi-
ques. La liste des types disponibles est dfinie dans la
documentation de chaque SGBD.
Numrique
Les types SQL2 SMALLINT et INTEGER stockent des
nombres entiers, respectivement sur 2 ou 4 octets. Les
types entiers disponibles dans le SGBD MySQL sont lis-
ts dans le Tableau 1. Le type peut tre suivi par loption
UNSIGNED, celle-ci permet de prciser que les valeurs at-
tendues doivent tre positives (non signes). Le domai-
ne des entiers positifs sera donc crit dans MySQL :
INTEGER UNSIGNED
Suivant le type de donnes dfini pour une colonne,
les informations peuvent tre modifies lors dune in-
sertion ou dune mise jour. Par exemple, linsertion
dun nombre ngatif dans une colonne type UNSIG-
NED peut entraner le changement de la donne en 0.
Pour pallier cela, il faut paramtrer le mode SQL de My-
SQL en strict. Pour ce faire, il est ncessaire dajouter
dans le fichier de configuration de MySQL (fichier my.ini
sous Windows, my.cnf pour Linux et Mac OS X) la ligne
suivante :
sql _ mode = strict _ all _ tables
Ainsi, une mauvaise insertion sera rejete et la donne
ne sera pas altre.
Les types SQL2 DECIMAL et FLOAT stockent res-
pectivement des nombres virgule fixe (prix, notes, ...)
et flottante (pourcentages, fractions, ...). La liste des ty-
pes numriques disponibles dans le SGBD MySQL est
donne dans le Tableau 1. La dfinition des nombres
virgule fixe suit la syntaxe :
DECIMAL(M, D) [UNSIGNED]
M reprsente le nombre total de chiffres stocks dans
la base, dont D dcimales. Cest la somme du nombre
D de chiffres derrire la virgule et du nombre de chiffres
avant la virgule. Ainsi DECIMAL(5,2) permettra de re-
prsenter des nombres de -999.99 999.99 (cinq chif-
fres dont deux sont placs derrire la virgule).
Chanes de caractres
Les types CHAR et VARCHAR stockent respectivement
des chanes de caractres de taille fixe ou variable. La
taille maximale est indique entre parenthses et doit
tre comprise entre 1 et 255 caractres :
CHAR(25)
Pour des chanes de plus grande taille, il faut utiliser les
types textes MySQL prsents dans le Tableau 1.
Le type CHAR est bien adapt pour stocker des infor-
mations dont la taille est identique ou varie peu (numro
dimmatriculation, numro ISBN de livres, ...). Lorsque
les valeurs entres dans la colonne natteignent pas la
taille dfinie, la chane est complte par des espaces.
Toutes les valeurs de la colonne sont stockes sur le
mme nombre doctets.
Le type VARCHAR est utilis lorsque les donnes ont
une longueur variable (titre de livre, nom dauteur, ).
Le nombre doctets utilis pour stocker chaque champ
varie en fonction du nombre de caractres de la chane,
plus un octet pour mmoriser cette taille.
Le choix du type de donnes a donc un impact sur
lespace disque utilis par la base de donnes.
Si linsertion est suprieure la taille du champ, le
comportement par dfaut de MySQL sera de tronquer
du texte. Si MySQL est en mode strict, linsertion sera
refuse.
Temps
Les types temporels de la norme SQL sont les suivants :
DATE : une date comprenant le jour, le mois et lan-
ne sur quatre chiffres,
TIME : un horaire avec heure(s), minute(s)
et seconde(s),
TIMESTAMP : nombre de secondes depuis le 1er jan-
vier 1970 ce jour.
Le SGBD MySQL propose des types temporels suppl-
mentaires comme indiqus dans le Tableau 1.
Cration de tables
La commande CREATE TABLE ajoute une table dans la
base. Elle permet de nommer la table, de dfinir le nom
et le type de ses colonnes et de fixer les contraintes din-
tgrit. La syntaxe de la commande est la suivante :
www.phpsolmag.org 43
Pour les dbutants
CREATE TABLE nom _ table (
nom _ colonne1 type [option],
nom _ colonne2 type [option],
...
nom _ colonneN type [option],
CONSTRAINT nom _ contrainte1 type _
contrainte1,
CONSTRAINT nom _ contrainte2 type _
contrainte2,

CONSTRAINT nom _ contrainteN type _


contrainteN
);
Ces instructions vont tre dcrites dans les prochaines
sections.
Pour crer une colonne, il faut suivre la syntaxe :
nom _ colonne type [option]
Le type de la colonne est une contrainte dintgrit de
domaine. Il indique le domaine des valeurs de la colon-
ne (cf. section Types de donnes). Par exemple, les co-
lonnes isbn et nb_pages de la table livre (Tableau 3),
sont cres par linstruction :
isbn CHAR(20),
nb_pages INTEGER UNSIGNED
Le type peut tre suivi dune ou plusieurs options :
NOT NULL : le champ doit tre obligatoirement rem-
pli, il ne peut pas contenir la valeur NULL. Cette va-
leur reprsente labsence dinformation, elle ne doit
pas tre confondue avec la valeur numrique 0 ou
une chane de caractres vide,
UNIQUE : les valeurs de la colonne doivent tre dis-
tinctes,
DEFAULT valeur : valeur attribue par dfaut au
champ concern lorsque celui-ci nest pas renseign,
AUTO _ INCREMENT : lorsquune ligne est ajoute
dans la table, une colonne de type AUTO _ INCRE-
MENT prendra un entier unique auto incrment
dans ce champ. Cette option ne fait pas partie de la
norme SQL mais est disponible dans MySQL.
La colonne titre de la table livre doit forcment tre
renseigne et la colonne langue peut seulement pren-
dre une des valeurs prdfinies par le biais d'une liste
(ENUM), par dfaut le franais (Listing 1). Ainsi pour les
crer, linstruction est de la forme :
titre VARCHAR(30) NOT NULL,
langue ENUM(francais,anglais,allemand,es
pagnol,chinois) DEFAULT francais
Les caractres autoriss dans les noms des objets peu-
vent varier selon le SGBD. Pour tre compatible, il est
prfrable de commencer par une lettre de lalphabet
et de nutiliser ensuite que les lettres de lalphabet en mi-
nuscule et majuscule, les chiffres et le caractre soulign.
Bien que MySQL supporte lutilisation de mots rservs
du langage (create, insert, ...), il est toutefois dconseill
de les utiliser pour nommer vos tables ou vos colonnes.
Suivant le systme dexploitation, le nom des tables
et des colonnes peut tre sensible la casse.
Dfinition des contraintes
Les donnes de la base doivent rester conformes ce qui
est attendu. Afin de vrifier que les donnes restent coh-
rentes lors de la manipulation de la base, il est ncessaire
de dfinir des contraintes dintgrit. Celles-ci permettent
de rejeter des actions qui ne respecteraient pas la coh-
rence de la base et peuvent tre dfinies par la syntaxe :
CONSTRAINT nom _ contrainte type _ contrainte
Il est ncessaire de leur donner un nom (norme SQL2) et de
spcifier de quel type de contrainte il sagit (cl primaire, cl
unique, cl trangre, vrification). La plupart des SGBD
acceptent que les contraintes ne soient pas nommes ex-
plicitement lors de la cration, dans ce cas cest le SGBD
Listing 1. cration base de donnes
-- creer la base
CREATE SCHEMA biblio;
-- creer les utilisateurs
GRANT SELECT ON biblio.livre TO lecteur IDENTIFIED BY
'motdepasse1';
GRANT ALL PRIVILEGES ON biblio.* TO bibliothecaire
IDENTIFIED BY 'motdepasse2';
-- selectionner la base de travail
USE biblio;
-- creer les tables
CREATE TABLE zone (
code _ zone CHAR(10),
piece VARCHAR(20),
meuble VARCHAR(20),
CONSTRAINT pk _ zone PRIMARY KEY (code _ zone)
)ENGINE = InnoDB;
CREATE TABLE livre (
isbn CHAR(20),
titre VARCHAR(30) NOT NULL,
genre ENUM('roman','policier','theatre','historique','fant
astique'),
date _ parution YEAR,
nb _ pages INTEGER UNSIGNED,
code _ zone CHAR(10),
CONSTRAINT pk _ livre PRIMARY KEY (isbn),
CONSTRAINT fk _ zone FOREIGN KEY (code _ zone) REFERENCES
zone(code _ zone) ON DELETE SET NULL ON UPDATE CASCADE
)ENGINE = InnoDB;
-- ajouter une colonne
ALTER TABLE livre ADD (langue ENUM('francais','anglais','
allemand','espagnol','chinois') DEFAULT 'francais');
-- afcher la liste des tables de la base
SHOW TABLES;
-- afcher la structure des tables
DESCRIBE zone;
DESCRIBE livre;
10/2010 44
SQL
qui attribue un nom par dfaut. Nommer les contraintes
permet dune part de les modifier plus facilement et, dautre
part, dobtenir des messages derreur plus clairs que ceux
qui font rfrence une contrainte dont le nom a t attri-
bu automatiquement par le SGBD. Le nom donn la
contrainte doit tre unique pour toute la base. Il devrait
tre compos du nom de la table prfix par une abrvia-
tion reprsentant le type de contrainte. Par exemple, la cl
primaire dans la table auteur sera nomme pk_auteur
(pk = primary key) et une cl trangre dans la table livre
pourra tre nomme fk_zone (fk = foreign key).
Cl primaire
Une cl primaire est un sous ensemble minimal de co-
lonnes dune table dont les valeurs identifient de mani-
re unique une ligne de la table. Toute table dune base
de donnes requiert une cl primaire qui doit tre ren-
seigne pour chaque enregistrement. Par exemple dans
la table livre, la cl primaire est le numro ISBN car il
reprsente un seul et unique livre (Tableaux 3 et 5).
Une contrainte de cl primaire peut porter sur une ou
plusieurs colonnes et scrit de la manire suivante :
PRIMARY KEY (col1 [, col2, ])
Linstruction qui suit indique que la cl primaire de la ta-
ble livre est la colonne isbn (Tableau 3) :
CONSTRAINT pk_livre PRIMARY KEY (isbn)
Cl unique
Une cl unique est un sous ensemble de colonnes dune
table pour lequel aucun doublon nest autoris.
Une contrainte de type cl unique scrit :
UNIQUE KEY (col1 [, col2, ])
Une cl primaire est unique et non nulle, cest--dire
que la ou les colonnes de la cl ne peuvent pas conte-
nir la valeur NULL et quune mme valeur ne peut pas
apparatre plus dune fois.
Cl trangre
Une cl trangre est un sous ensemble de colonnes
dune table qui fait rfrence une cl primaire ou uni-
que dune autre table. Les colonnes qui constituent la cl
trangre doivent avoir le mme type que les colonnes r-
frences. Par exemple, dans la table livre, la colonne
code_zone est cl trangre et rfrence la cl primaire
code_zone de la table zone (Tableau 3). Un livre ne peut
pas rfrencer une zone qui ne serait pas enregistre
dans la base. Il est cependant possible denregistrer un
livre qui ne serait pas encore rang sa place en insrant
la valeur NULL dans le champ code_zone (Tableau 5).
Lutilisation dune cl trangre empche le clas-
sement de certains livres dans des zones qui nexiste-
raient pas, ce qui garantit la cohrence de la base.
Une contrainte de type cl trangre doit tre dfi-
nie ainsi :
Tableau 3. Structure de la table LIVRE
Colonne Type de donnes Description
isbn chane Cl primaire, identiant du livre compos de son numro ISBN
titre chane Titre du livre
genre numration Genre
date_parution anne Anne de parution
nb_pages entier positif Nombre de pages
code_zone chane Cl trangre rfrenant la colonne code_zone de la table zone
Tableau 4. Contenu de la table ZONE
code_zone piece meuble
c10 Chambre Armoire en pin
c20 Chambre Armoire en pin
s8 Salon Bibliotheque noire
Tableau 5. Contenu de la table LIVRE
isbn titre genre date_parution langue nb_pages code_zone
128-5-56985-5 Fall of giants historique 2010 anglais 255 c20
598-5-55596-2 Notre Dame de Paris roman 1831 francais 123 s8
102-2-35419-5 Les fourmis roman 1991 francais 300 c10
523-5-65472-9 David Coppereld roman 1850 anglais 458 s8
320-2-02365-5 Le bourgeois gentilhomme theatre 1670 francais 152 NULL
152-5-55695-2 Le seigneur des anneaux fantastique 1954 francais 832 c10
www.phpsolmag.org 45
Pour les dbutants
FOREIGN KEY (col1 [, col2, ]) REFERENCES nom_
table (col1 [, col2, ]) [clause action]
A la suite de FOREIGN KEY, il faut lister la ou les colon-
nes de la table qui sont cls trangres. Ces colonnes
rfrencent les colonnes dune autre table dont le nom
est indiqu la suite de REFERENCES. Gnralement,
les colonnes cls trangres portent le mme nom que
les colonnes quelles rfrencent.
La cration dune table comportant des cls trang-
res doit tre faite aprs la cration des tables rfren-
ces sinon une erreur sera gnre.
Dans la table livre, la colonne code_zone est une cl
trangre qui rfrence la cl primaire code_zone de la ta-
ble zone. Linstruction suivante permet de le spcifier :
CONSTRAINT fk_zone FOREIGN KEY (code_zone) RE-
FERENCES zone(code_zone)
Par dfaut, lorsquun champ rfrenc de la table zone
est modifi ou supprim, une erreur est gnre et em-
pche la modification ou la suppression. Ce comporte-
ment peut-tre redfini. Il est possible de spcifier une
clause de la forme ON UPDATE ou ON DELETE. Derrire
ces clauses, il faut indiquer laction entreprendre en
cas de mise jour ou de suppression :
CASCADE : toute modication ou suppression d'un
champ rfrenc entrane la modication de la va -
leur ou la suppression de la ligne dans la table
comportant la cl trangre
SET NULL : toute modication ou suppression dun
champ rfrenc entrane lattribution de la valeur
NULL au champ correspondant dans la table com-
portant la cl trangre
Par exemple, en cas de suppression de la zone c10
de la table zone (tableau 4), il ne faurait pas suppri-
mer les livres qui rfrencent cette zone. Une telle
suppression doit entraner l'attribution de la valeur
NULL aux champs code_zone dont la valeur est c10
dans la table livre. Ceci est ralis grce la clause
ON DELETE SET NULL. En cas de mise jour, l'ins-
truction ne devra pas tre bloque : les modifications
seront reportes dans les champs qui rfrencent
les valeurs modifies grce la clause ON DELETE
CASCADE. Par exemple, si s8 est modifi en s1 dans
zone, la modification sera rpercute automatique-
ment dans livre.
CONSTRAINT fk _ zone FOREIGN KEY (code _ zone)
REFERENCES zone(code _ zone) ON DELETE SET
NULL ON UPDATE CASCADE
Afin que MySQL permette la dclaration de cls tran-
gres et gre les transactions, il faut indiquer que les
tables sont de type InnoDB. Autant la table rfrence
que la table dclarant la contrainte de type cl trang-
re. Pour indiquer quune table est de type InnoDB, dans
la syntaxe de cration de la table, il faut ajouter linstruc-
tion ENGINE = InnoDB avant le ; (Listing 1).
Contrainte sur le domaine
La contrainte dintgrit CHECK permet de vrifier quune
valeur insre est conforme une condition, par exem-
ple quun nombre est compris entre deux bornes.
CONSTRAINT nom_contrainte CHECK (condition)
MySQL ne gre pas les contraintes de type CHECK. Il
existe trois manires de contourner labsence de cette
fonctionnalit :
l'option UNSIGNED interdit linsertion de nombres n-
gatifs (colonne nb _ pages : Listing 1),
le type ENUM permet de restreindre les valeurs auto-
rises une liste (colonnes langue et genre),
un trigger peut tre dclench pour vrier une
condition lors dune insertion ou dune mise
jour.
Modification de la structure
Une fois les tables cres, il est possible dy ajouter
des colonnes, de modifier le type de ces dernires ou
dajouter une contrainte dintgrit. Il est galement
possible de supprimer des lments de la base.
Les commandes ALTER TABLE et DROP permettent
de modifier la structure de la base.
Ajout de colonne
Pour ajouter une ou plusieurs colonnes, il faut utiliser la
commande ALTER TABLE avec le mot-clef ADD suivi de
la dfinition de chaque colonne.
ALTER TABLE nom_table ADD (
nom_col1 type1, nom_col2 type2, );
Linstruction suivante ajoute une colonne langue la ta-
ble livre :
ALTER TABLE livre ADD (langue ENUM('franais',
'anglais','allemand','espagnol','chinois'));
Modification du type dune colonne
Pour modifier une ou plusieurs colonnes dans le SGBD
MySQL, il faut utiliser la clause MODIFY suivie de la nou-
velle dfinition de chaque colonne.
ALTER TABLE nom_table MODIFY(
nom_col1 nouveau_type1,
nom_col2 nouveau_type2,
);
10/2010 46
SQL
Ajout de contrainte
La clause ADD CONSTRAINT permet dajouter une contrainte
dintgrit. La dfinition de la contrainte est la mme que cel-
le dcrite dans la section intitule Dfinition des contraintes.
ALTER TABLE nom_table
ADD CONSTRAINT nom_contrainte type_contrainte;
Suppression de contrainte
De mme quil est possible de modifier la structure de la base,
des commandes permettent den supprimer des lments.
La clause DROP CONSTRAINT de la commande AL-
TER TABLE permet de supprimer la contrainte dintgri-
t dont le nom est indiqu dans linstruction :
ALTER TABLE nom _ table DROP CONSTRAINT nom _
contrainte;
Dans MySQL, les commandes de suppression des cls
primaires et trangres sont de la forme :
ALTER TABLE nom_table DROP PRIMARY KEY;
ALTER TABLE nom_table DROP FOREIGN KEY nom_
contrainte;
Linstruction ci-aprs supprime de la table livre la
contrainte de type cl trangre, dont le nom est fk_
zone, qui rfrence la cl primaire de la table zone :
ALTER TABLE livre DROP FOREIGN KEY fk_zone;
Suppression de table
La commande DROP TABLE permet de supprimer une
table dans la base. Par exemple, linstruction suivante
permet la suppression de la table livre :
DROP TABLE livre;
Si on tente de supprimer une table dont la cl primaire
est rfrence en tant que cl trangre dans une autre
table, MySQL gnre une erreur et la table nest pas
supprime.
DROP TABLE zone;
>>> ERROR 1217 : Cannot delete or update a
parent row : a foreign key constraint fails
Si vous voulez tout de mme supprimer la table zone,
il faut commencer par supprimer la table livre ou la
contrainte de type cl trangre qui lie les deux tables.
Suppression de base
La commande DROP SCHEMA supprime dfinitivement
une base, toutes ses tables et leur contenu.
DROP SCHEMA nom _ base;
Clients MySQL
Pour communiquer avec la base de donnes, il est pos-
sible dentrer les commandes en mode console ou gr-
ce une interface graphique. Les deux solutions sont
quivalentes et vont tre prsentes ci-aprs. Il est n-
cessaire pour leur utilisation davoir dmarr le serveur
de base de donnes de la distribution WAMP, XAMPP,
MAMP ou EasyPHP.
Console
Pour vous connecter au serveur depuis la console, vous
devez entrer linstruction suivante :
mysql [-h nom _ hote] [-u login] [-p]
Lorsque le nom de lhte nest pas spcifi, la connexion
est tente en local sur lordinateur, cest--dire que le
serveur est considr comme tant sur le mme ordina-
teur que le client. Loption -u indique quil va tre spcifi
un nom dutilisateur. Lors de votre premire connexion
en local, lutilisateur attendu est root (administrateur
de la base). Loption -p prcise quil est ncessaire de
renseigner un mot de passe. Par dfaut, ladministra-
teur na pas besoin dentrer un mot de passe lors de sa
premire connexion. Si une erreur dauthentification est
gnre, vrifiez quun mot de passe na pas t dfini
par dfaut par la plateforme que vous utilisez.
Une fois authentifi, vous pouvez entrer les com-
mandes SQL du Listing 1 dans la console.
Lexcution de toutes les commandes aura permis
la cration de la base biblio, des utilisateurs lecteur
et bibliothecaire et des deux tables livre et zone.
La commande QUIT permet de quitter le client.
PhpMyAdmin
Linterface Web phpMyAdmin permet de crer des ba-
ses, des tables et de manipuler les donnes sans avoir
de connaissances SQL. Chaque action effectue via cet
outil envoie une ou plusieurs requtes SQL au serveur
MySQL. La ou les requtes envoyes sont affiches en
haut de la page dans linterface graphique. Linterface
propose galement une console SQL qui permet de
rentrer des commandes SQL directement.
Si vous utilisez XAMPP, WAMP, MAMP ou Easy-
PHP, vous avez sur la page daccueil du serveur web
un lien vers phpMyAdmin. Sinon entrez lURL de votre
application phpMyAdmin dans votre navigateur.
Linterface graphique de phpMyAdmin comporte deux
cadres. La cadre gauche permet de slectionner une ba-
se de donnes parmi la liste des bases hberges sur le
serveur MySQL. Une fois quune base a t slectionne,
la liste de ses tables est affiche sous le nom de la base.
Le cadre de droite permet dagir sur les bases de
donnes : cration de bases et de tables, modification,
suppression, gestion des privilges, consultation et ma-
nipulation des donnes.
www.phpsolmag.org 47
Pour les dbutants
Figure 2. PhpMyAdmin : dclaration des types
Figure 3. PhpMyAdmin : structure de la table
Figure 4. PhpMyadmin : dclaration dune cl trangre
10/2010 48
SQL
La page daccueil comporte un champ texte permet-
tant dindiquer le nom de la base crer. Lenvoi du for-
mulaire gnre et soumet automatiquement MySQL la
commande :
CREATE SCHEMA nom _ base;
Il est maintenant possible de crer une table dans la
base grce au champ intitul Crer une nouvelle ta-
ble. Il faut indiquer le nombre de colonnes que celle-ci
contiendra. Pour finir de crer la table, il faut indiquer le
nom des champs et leur type ainsi que le moteur de la
table (InnoDB : Figure 2). PhpMyAdmin gnre la com-
mande de cration de table, lenvoie MySQL et affiche
sa structure (Figure 3). Les cls primaires et trang-
res sont dfinies ce niveau. Pour indiquer la cl pri-
maire, il suffit de cliquer sur licne en forme de cl
(Figure 3). Un clic sur le lien Gestion des relations per-
met denregistrer les cls trangres dont les colonnes
concernes doivent avoir t indexes au pralable
par un clic sur licne en forme dclair (Figure 4).
Longlet Privilges permet de grer les utilisateurs
et leurs droits. Une fois la base slectionne, vous pou-
vez cocher les privilges accords par rapport au LMD,
au LDD et au LCD. Il est possible de dfinir des privil-
ges sur toute la base ou sur des tables.
Conclusion
Vous avez appris dans cet article les bases des langa-
ges de dfinition et de contrle de donnes : cration
de bases et de tables, dfinition de contraintes, ges-
tion des utilisateurs. Dans le prochain numro, vous ap-
prendrez insrer et manipuler des donnes.
CILIA MAURO, MAGALI CONTENSIN
Cilia Mauro est gestionnaire de bases de donnes et dveloppeur
dapplications web au CNRS. Elle enseigne les bases de donnes
et PHP luniversit.
Contact : cilia.mro@gmail.com
Magali Contensin est chef de projet en dveloppement dapplica-
tions au CNRS. Elle enseigne depuis plus de dix ans le dveloppe-
ment dapplications web luniversit et est lauteur de nombreux
articles sur le dveloppement web en PHP.
Contact : http://magali.contensin.online.fr
Sur Internet
http://www.mysql.fr MySQL,
http://www.wampserver.com Outil Wamp,
http://sourceforge.net/projects/xampp Outil Xamp,
http://www.mamp.info Outil Mamp,
http://www.easyphp.org Outil EasyPHP,
http://www.phpmyadmin.net phpMyAdmin.
Pour plus de renseignement : editor@phpsolmag.org
Rejoignez le Club .PRO
Conseil, conception et d veloppement dapplications volu es pour
les systmes dinformations nternet/intranet/extranet. Alliant les
comptences dune SS et dune Web Agency, Cognix Systems
conoit des applicatifs et portails web lergonomie travaille
et des sites nternet forte valeur ajoute.
http://www.cognix-systems.com

Stonfield nworld propose aux entreprises des solutions globale
dintgration dnternet et des Univers Virtuels dans leur strat gie
de dveloppement. Au-del de ses services, la socit consacre 30%
de ses ressources des travaux de R&D sur le e-Commerce
et le e-Learning dans les Mondes Virtuels

WEB82
Cration et hbergements de sites web pour particuliers, associations,
entreprises, e-commerce. Dveloppement entierement aux normes
W3C (www.w3.org) de sites web de qualit, au graphisme soign
et employant les dernieres technologies du web (PHP5, MySQL5,
Ajax, XHTML, CSS2).
http://www.web82.net
WEB82
Cr ation et h bergements de sites web pour particuliers, associations,
entreprises, e-commerce. Dveloppement entierement aux normes
W3C (www.w3.org) de sites web de qualit, au graphisme soign
et employant les dernieres technologies du web (PHP5, MySQL5,
Ajax, XHTML, CSS2).
http://www.web82.net

Expert des solutions de gestion et de communication dentreprise
en Open Source, Core-Techs conoit, integre, dploie et maintient des
systemes de Gestion de Contenu Web, de Gestion Documentaire,
de Gestion de la Relation Client (CRM), decommerce et de travail
ollaboratif.
http://www. core-techs. fr
PoP Factory,SS sp cialis e Web. D veloppement de solutions
applicatives spcifi ques ; offre de solutions packages : catalogue
numrique, e-commerce, livre/magazine numrique, envoi SMS.
Nous accompagnons nos clients tout au long de leur projet : audit,
conseil, dveloppement, suivi et gestion.
http://www.popfactory.com / info@popfactory.fr

Sp cialistes en CRM Open Source, nous proposons une offre
complte de prestations sur la solution SugarCRM. Notre valeur
ajoute rside dans une expertise ractive et une exprience des
problmatiques de la GRC. Nous vous aidons tirer le meilleur
parti de votre solution CRM.
http://www.bluenote-systems. com

Conseil, Expertises, Formations et Projets E-business centr s au tour


du csur de mtier : la Business ntelligence. ntelligence Power vous
propose des solutions innovant.es pour aligner la technologie sur
la stratgie de votre entreprise.
http://www. intelligencepower. com

Vous souhaitez tre en premire page des moteurs de recherche ?


Rejoignez-nous, 100% des clients Web Alliance sont en 1re page
de Google. Web Alliance, socit de conseil spcialise dans le
rfrencement internet, vous propose son expertise (rfrencement,
liens sponsoriss, web-marketing).
www. web-alliance. fr
InteIIigence Power
Web AIIiance
Core-Techs
POP FACTORY
BIue Note Systems
COGNIX Systems
StonfieId InworId
Club .PRO
Pour plus de renseignement : editor@phpsolmag.org
Rejoignez le Club .PRO
Conseil, conception et d veloppement dapplications volu es pour
les systmes dinformations nternet/intranet/extranet. Alliant les
comptences dune SS et dune Web Agency, Cognix Systems
conoit des applicatifs et portails web lergonomie travaille
et des sites nternet forte valeur ajoute.
http://www.cognix-systems.com

Stonfield nworld propose aux entreprises des solutions globale
dintgration dnternet et des Univers Virtuels dans leur strat gie
de dveloppement. Au-del de ses services, la socit consacre 30%
de ses ressources des travaux de R&D sur le e-Commerce
et le e-Learning dans les Mondes Virtuels

WEB82
Cration et hbergements de sites web pour particuliers, associations,
entreprises, e-commerce. Dveloppement entierement aux normes
W3C (www.w3.org) de sites web de qualit, au graphisme soign
et employant les dernieres technologies du web (PHP5, MySQL5,
Ajax, XHTML, CSS2).
http://www.web82.net
WEB82
Cr ation et h bergements de sites web pour particuliers, associations,
entreprises, e-commerce. Dveloppement entierement aux normes
W3C (www.w3.org) de sites web de qualit, au graphisme soign
et employant les dernieres technologies du web (PHP5, MySQL5,
Ajax, XHTML, CSS2).
http://www.web82.net

Expert des solutions de gestion et de communication dentreprise
en Open Source, Core-Techs conoit, integre, dploie et maintient des
systemes de Gestion de Contenu Web, de Gestion Documentaire,
de Gestion de la Relation Client (CRM), decommerce et de travail
ollaboratif.
http://www. core-techs. fr
PoP Factory,SS sp cialis e Web. D veloppement de solutions
applicatives spcifi ques ; offre de solutions packages : catalogue
numrique, e-commerce, livre/magazine numrique, envoi SMS.
Nous accompagnons nos clients tout au long de leur projet : audit,
conseil, dveloppement, suivi et gestion.
http://www.popfactory.com / info@popfactory.fr

Sp cialistes en CRM Open Source, nous proposons une offre
complte de prestations sur la solution SugarCRM. Notre valeur
ajoute rside dans une expertise ractive et une exprience des
problmatiques de la GRC. Nous vous aidons tirer le meilleur
parti de votre solution CRM.
http://www.bluenote-systems. com

Conseil, Expertises, Formations et Projets E-business centr s au tour


du csur de mtier : la Business ntelligence. ntelligence Power vous
propose des solutions innovant.es pour aligner la technologie sur
la stratgie de votre entreprise.
http://www. intelligencepower. com

Vous souhaitez tre en premire page des moteurs de recherche ?


Rejoignez-nous, 100% des clients Web Alliance sont en 1re page
de Google. Web Alliance, socit de conseil spcialise dans le
rfrencement internet, vous propose son expertise (rfrencement,
liens sponsoriss, web-marketing).
www. web-alliance. fr
InteIIigence Power
Web AIIiance
Core-Techs
POP FACTORY
BIue Note Systems
COGNIX Systems
StonfieId InworId
www.phpsolmag.org 49
Scurit
P
our simplifier la comprhension de cet article au
public dbutant, la POO (Programmation Orien-
te Objet), ainsi que l'utilisation de PDO (PHP
Data Object) pour la connexion la base de donnes
n'ont pas t utiliss. De plus, comme beaucoup de co-
urs utilisent encore les fonctions mysql_xxx pour les
oprations sur base de donnes Mysql, j'ai choisi de les
utiliser mais il est vrai qu'il serait grand temps d'utiliser
mysqli_xxx ou PDO.
Never trust user inputs
Quoi de mieux que de dbuter par l'exemple? Nous al-
lons en premier lieu tudier le Listing 1.
Celui ci est un fichier php contenant un formulai-
re et une partie de code qui permet le traitement de
la rponse de ce formulaire. Nous voyons qu'il con-
tient quelques champs devant contenir du texte afin
de permettre un utilisateur de s'inscrire. Il rcupre
les informations reues dans les variables POST et les
utilise pour les insrer en base de donnes. Nous voy-
ons dj ici une erreur trs grave brisant la rgle la
plus importante du programmeur : Never trust user in-
puts. Ne jamais faire confiance aux informations que
l'utilisateur a saisies. Ainsi, l'utilisateur a-t-il rentr une
adresse mail valide ? Qui dit qu'il n'a pas entr du tex-
te dans le champ anne? Voire n'a-t-il pas tent autre
chose ?
J'espre que vous n'tes pas dans ce cas l, ma-
is si vous dbutez et que vous vous retrouvez mal-
gr tout dans cette situation, ne vous alarmez pas,
nous allons tudier comment vrifier les saisies de
l'utilisateur.
Premirement vrifier les donnes. Il peut y avoir
des donnes texte ou de donnes telles que des chif-
fres. Soit l'un soit l'autre bien qu'il existe un troisime
type : les fichiers que nous aborderons trs rapidement
plus loin. Cela peut tre un prnom, une ville, un com-
mentaire, ou alors, une anne, un numro de tlpho-
ne...
La premire rgle que doit respecter tout program-
meur PHP est de vrifier les donnes externes. Tout ce
qui ne provient pas de la base de donnes devra tre
pass ' la moulinette' afin d'viter d'une : de mauvai-
ses informations, de deux : des attaques pouvant met-
tre mal votre base de donnes, votre site, voire aussi
vos visiteurs.
La premire erreur concerne le pseudonyme: la
fonction trim() est utilise sur ce champ pour suppri-
mer les espaces en trop, en encadrant la valeur saisie
par l'utilisateur.... Mais l'utilisateur pourrait ne rien avoir
saisi !
Pour vrifier qu'une variable n'est pas vide nous pou-
vons utiliser la fonction empty() qui renvoi un boolen :
0 si la variable passe en paramtre contient quelque
chose, sinon 1 si c'est vide.
De cette manire nous entrons dans la condition su-
ivante si la variable $pseudo contient des informations
aprs le trim();
if (!empty($pseudo))
Introduction
la scurit web
Un dveloppeur quel qu'il soit peut raliser de grands projets.
Mais quelle chute fait-il lorsque le dit projet vient d'tre dtruit
par une attaque ? De trs haut, tellement haut que certains
en abandonnent tout espoir. Dans cet article nous tudierons
les bonnes pratiques les plus simples avoir pour viter
au maximum cette situation.
Cet article explique :
Comment contrer les mthodes utilises par certaines person-
nes pour dtruire une base de donnes.
Comment contrer les mthodes pour voler des sessions.
Comment se prmunir de bien d'autres soucis.
Ce qu'il faut savoir :
Connatre les systmes de base de donnes.
Programmer en Php et le langage SQL.
Utilisation des formulaires.
10/2010 50
Scurit web
{
echo 'Pseudo saisi';
}
else
echo 'Formulaire resaisir !';
Cette fonction sera utiliser sur chacun de nos l-
ments rellement ncessaires comme le pseudo, mot
de passe et mail.
If ( !empty($pseudo)) AND !empty($_
POST['password']) AND !empty($_POST['email']
)
{
echo 'on peut continuer les
vrifications du formulaire';
}
else
echo 'formulaire ressaisir';
Nous nous approchons dj de la fin ! Avec cela no-
us sommes 'srs' que nos champs ne sont pas vides.
Pour le pseudo c'est bon, il nous reste mots de passe
et email dans la catgorie champs valider, puis an-
ne vrifier. Oui, l'adresse mail devra tre vrifie.
Mais revenons sur la comparaison des mots de pas-
se Password et Password2. Dans le listing1a.php, la
comparaison est ralise par un simple ==. Je vous
invite utiliser la fonction strcmp ( ) qui permet de
comparer 2 variables et renvoi 0 si celles-ci sont iden-
tiques !
Tentez de valider un formulaire avec le code du list-
ing1a.php avec 000000 pour premier password et 000
pour le second. Vous aurez une mauvaise surprise car
PHP pourra supposer que les deux variables sont ga-
les 0!
Il nous reste donc l'adresse mail vrifier. Pour cela
il y a ici deux coles : la vieille utilisant les expressions
rgulires et une toute rcente utilisant la librairie magi-
que permettant de 'filtrer' les donnes. Nous allons utili-
ser une expression rgulire, la plus fastidieuse mon
got.
Ce cours n'ayant pas pour but d'expliquer les 'regex'
nous ferons simple. Une adresse mail c'est quoi ? bi-
dule@monsite.fr, machin.moi@supersite.com. On peut
donc en dduire qu'une adresse mail commence par
une suite de caractres pouvant aussi tre des chiffres
voire certains caractres prcis puis un arobase @ en-
suite un nom de domaine (pouvant contenir un sous
domaine) donc l aussi des caractres du mme type
qu'au dbut puis un '.' (point) sparant du com, fr ou
autre.
Nous pouvons former avec cela un patron, une sor-
te de modle qui permettra de comparer une chane de
caractres celui-ci. Si les deux ne correspondent pas,
l'inscription ne sera pas possible.
Listing 1a. Exemple ne pas suivre
include('includes/fonctions.php ');
connexion();// on se connecte la BDD
If isset($ _ POST['formulaire'])
{
$pseudo=trim($ _ POST['login']);
$mot _ passe=trim($ _ POST['password']);
$email=trim($ _ POST['email']);
$annee=trim($ _ POST['annee']);
if($ _ POST['password']==$ _ POST['password2'])//
compare les passwords
{
mysql _ query("INSERT INTO comptes (pseudo,
pass, mail, annee, ) VALUES ('".$pseudo."', '".$mot _
passe."', '".$email."', '".$annee."'") );
}
//on ralise des traitements pour le reste de
l'inscription (envoi d'un mail ou autre)
// ........................
//n des traitements
}
else
{
echo '<form method="post" action="listing1a.
php">
<h1>Inscrivez vous !</h1>
Identiant: <input name="login" value=""
type="text"/><br/>
Mot de passe: <input name="password"
value="" type="password"/><br/>
Mot de passe (conrmation): <input
name="password2" value="" type="password"/><br/>
Email : <input name="email" value=""
type="text"/><br/>
Anne de naissance: <input name="annee"
value="" type="text"/><br/>
<input class="button" name="formulaire"
value="Connexion" type="submit">
</form>';
}
?>
Listing 1b. Mieux mais....
<?php
include('includes/fonctions.php ');
connexion();// on se connecte la BDD
If isset($ _ POST['formulaire'])
{
$log=trim($ _ POST['login']);
$pass=trim($ _ POST['password']);
if (!empty($log) AND !empty($pass))
{
$recup=mysql _ query( select * from comptes
where login=' .$log. ' and pass=' .$pass. ' );
//on ralise des traitements pour la
connexion
// ........................
//n des traitements
}
}
else
{
echo '<form method="post" action="listing1b.
php">
Identiant: <input name="login" value=""
type="text" /><br/>
Mot de passe: <input name="password"
value="" type="password" /><br/>
<input class="button" name="formulaire"
value="Connexion" type="submit">
</form>';
}
www.phpsolmag.org 51
Scurit
La protection des bases de donnes
Voyons maintenant comment se protger cot serveur.
La plus grande catastrophe qui pourrait arriver est la
perte de la base de donnes. Comment font-ils ? Com-
bien se sont retrouvs avec un site vid de son conte-
nu ? Une chose que beaucoup ignorent, c'est combien
cela peut tre facile. L'objectif de votre ennemi est le
traitement du formulaire ou plus prcisment lors des
requtes SQL.
Nous avons dans le premier script vrifi les in-
formations saisies par l'utilisateur de votre site web.
Ce que nous avons pour l'instant seulement ralis
c'est garder une cohrence des informations reu-
es afin d'viter tout traitement inutile et informations
jeter. Cependant il nous reste protger notre base
de donnes car pour l'instant niveau scurit, disons
que nous n'avons absolument rien fait. Les chanes de
caractres comme le pseudo et le mot de passe sont
encore sensibles dans notre script prcdent alors il
faudra bien appliquer les nouvelles rgles tudies
dans cette partie et les appliquer au listing1a.php. Re-
gardons le listing1b.php.
Il rcupre les informations reues dans les variab-
les POST et les utilise pour les comparer ce qu'il existe
en base de donnes.
mysql_query( select * from comptes where
login=' .$log. ' and pass=' .$pass. ' )
Cette partie de code est cense vrifier les donnes
saisies sur le compte de la mme manire que no-
us l'avions ralise dans la premire partie. Voyo-
ns comment outre passer cela : Saisissons or a = a
dans le champ login et password. Cette requte res-
semblera dsormais : mysql_query( select *
from comptes where login=''or 'a' = 'a' and
pass=''or 'a' = 'a' ). Ceci est ce qu'on appelle
de l'injection SQL. C'est l'exemple mme de l'injection
la plus simpliste possible. Cette requte retournera
le premier enregistrement qu'elle trouvera et comme
vous le savez, lors de la cration d'un site web, le pre-
mier compte cr est souvent le compte administra-
teur... N'est-ce pas ?
Dans cette situation l'utilisateur devrait se retrouver
connect avec les droits de votre compte... Pas trs
plaisant n'est-ce pas? Bien sr il est possible d'aller en-
core plus loin ! Saviez vous que le # pouvait servir
mettre des commentaires dans le sql (suivant la con-
figuration). En mettant admin # dans le champ login,
la requte ressemblerais : select * from comptes
where login='admin';. Avec cette astuce vous pou-
vez modifier la requte comme bon vous semble... Il est
grand temps d'empcher cela !
$log=trim($_POST['login']);
$pass=trim($_POST['password']);
L'exemple suivant vous montre comment utiliser
cela.
if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-
]{2,}\.[a-z]{2,4}$#", $email))
{
echo 'Adresse valide';
}
else
{
echo 'Adresse non valide!';
}
Les regex peuvent tre utiles pour reconnatre des mots
(le systme de Bbcode des forums). Mais cela n'est pas
toujours vident de les utiliser.
Passons notre nouvelle fonction filter_var().
Elle prend 2 paramtres : le premier est la variable
examiner, le second est un 'filtre' permettant de sig-
naler quoi doit ressembler notre variable passe en
premier paramtre. Exemple : filter_var('bidule@
monsite.com', FILTER_VALIDATE_EMAIL);
Cette fonction renvoi la valeur du champ passe en
paramtre si elle corespond avec le filtre, sinon false. Je
vous invite faire plus ample connaissance avec cette
fonction qui pourrait bien vous simplifier la vie contraire-
ment aux regexp.
Il nous reste enfin le champ anne. Celui-ci ne doit
contenir que des nombres. Concernant les nombres, il y
a 2 solutions : l'utilisation du cast, ou alors une fonction
existante.
Le cast s'utilise de la manire suivante : $annee=
(int) $_GET['annee'];. Sinon il y a l aussi une
fonction bien pratique renvoyant un boolen si la cha-
ne passe en paramtre est un nombre. Cette fonction
magique c'est ctype_digit().
if (ctype_digit($_GET['annee']))
{
echo 'C\'est un nombre';
}
else
echo 'Ca n\'en n\'est pas un !';
la place des echo, il suffit de faire soit une nouvelle
affectation, soit ne rien changer.
Concernant ce dernier champ, il serait encore po-
ssible de vrifier que l'utilisateur a saisit une date plau-
sible mais cela est de votre ressort. Chacun est libre de
choisir sa mthode favorite mme si la premire tient
en une ligne.
La vrification des contenus est donc une phase trs
importante car elle peut permettre d'viter de fausses
donnes voire viter un peu de spam (dans les formula-
ires de contact par exemple). Cependant nous sommes
loin d'avoir rellement fini notre travail.
10/2010 52
Scurit web
$log=mysql_real_escape_string($log);
$pass=mysql_real_escape_string($pass);
mysql_query( select * from comptes where
login=' .$log. ' and pass=' .$pass. '
);
La fonction mysql_real_escape_string() permet
d'chapper tout caractre pouvant tre 'excut'
par le langage SQL tels que les apostrophes, guille-
mets, # et d'autres... En pensant utiliser cette unique
fonction, vous mettez l'abri bien des informations
censes rester dans votre base de donnes...
Cependant cela ne sert rien si vous ne passez pas
au chapitre suivant.
La base scurise avec un compte
non scuris.
Je me rappelle mes dbuts en programmation web. Je
suivais un tutoriel o l'auteur prcnisait de mettre le co-
de des fichiers inclus dans des fichiers .inc. Je crois que
l'auteur avait saut lui mme une tape dans son cours.
Un site bien dvelopp possdera une certaine organi-
sation de fichiers
la racine il y aura forcment un fichier index.php
ou .html et srement d'autres pages ainsi que des dos-
siers images ou design voire css et js. Il y aura aussi
trs souvent un dossier include dans lequel l'on mettra
des fichiers contenant diverses fonction du site ma-
is aussi un script contenant les identifiants de conne-
xion.
Souvent sous cette forme:
function connexion()
{
// on se connecte MySQL
@mysql_connect(localhost , logindebbd,
motdepasse);
mysql_select_db(bddprotegee);
}
Si ce code est ainsi plac dans le fichier truc.inc , tou-
tes les protections ralises dans le paragraphe prc-
dent n'auront servies rien ! Les plus malins(et pas
forcment uniquement ceux l) s'en sont douts depuis
le dpart, il suffit de taper l'adresse: http://www.votresi-
te/include/truc.inc et surprise, le fichier s'affiche dans le
navigateur affichant joliment le code avec le login mot
de passe du compte BDD... Voyons dj comment s-
curiser cela. Premirement changer cette extension .inc
en .php c'est sr. Si vous avez du code excutable dans
un tel fichier *,inc, il faut alors empcher son excution
lors de l'utilisation de l'url directe ; j'ai une seconde ta-
pe : .htaccess.
Le .htaccess permet de spcifier des rgles. Crez
un fichier .htaccess vide dans le dossier include.
Sous Windows, le systme d'exploitation risque de
refuser. Dans ce cas, ne mettez pas le point mais pen-
sez le modifier lorsque vous l'enverrez via FTP en le
renommant. ditez maintenant le contenu de ce fichier
pour y mettre le code suivant :
deny from all
allow from 127.0.0.1
<Files maintenance.html>
allow from all
</Files>
Ce code permet de signaler que ce dossier doit tre
inaccessible pour tout le monde (donc partir du web),
sauf le serveur lui mme. De cette manire les fichiers
sont disponibles partir d'un include du serveur mais
pas partir de l'extrieur. Deux autres points assez sim-
ples : dans tout dossier qui existe, il doit y avoir un fichier
index.html ou index.php mme vide pour empcher
l'affichage du contenu du dossier. De plus pensez uti-
liser 2 comptes mysql diffrents : un compte admin po-
ssdant certains droits lors de vos manipulations SQL,
et un autre compte ayant moins de droits (pas de DROP
par exemple) pour le site.
Cot serveur Web !
Nous avons vu comment proteger votre base de don-
nes. Il existe pourtant d'autres failles qu'il ne faut pas
ngliger.
La configuration mme de votre machine peut
vous porter dfaut : Register_globals peut en effet
vous poser bien des soucis. En effet, si elles sont
actives elle peuvent permettre quiconque de mo-
difier des valeurs de variable de votre code. Il vaut
donc mieux placer cette fonctionnalit sur OFF. Cette
directive devait normalement disparaitre dans PHP 6.
Vous pouvez diter la configuration soit dans le PHP.
ini de votre serveur si vous y avez accs soit dans un
.htaccess.
Pensez dsactiver les erreurs... ou plutt les
message d'erreurs en passant la fonction display_
errors OFF. Pourquoi cela? Pour viter que lorsque
quelqu'un de mal intentionn testera les failles de vo-
tre site, il puisse avoir des messages d'erreurs pouvant
parfois le guider dans sa recherche. Devenu obsolete
depuis PHP5.3, les magic_quotes avaient au dpart
t imagins pour simplifier la scurit en ralisant un
chappement automatique. Pour cela, vaut mieux rali-
ser sa scurit soit mme que via cette fonction qui ne
fait pas tout le ncssaire.
Vous pouvez la aussi mettre dans un .htaccess :
php _ ag magic _ quotes _ gpc off
php_flag magic_quotes_runtime off
ou alors votre fichier php.ini.
www.phpsolmag.org 53
Scurit
Scurit sur les fichiers uploads
Uploader des fichiers sur un site, cela se fait surtout sur
des forums pour mettre son avatar prfr. Seulement
l'upload de fichiers peut se rveler ultra dangereux s'il
est mal manipul.
Premirement, pensez examiner l'extension du fi-
chier (.jpg, .bmp .gif ou autre) afin de ne pas laisser
passer d'excutables. Cependant, cela ne vrifira en
rien le contenu du fichier ! Donc ne pensez pas qu'en
ayant filtr les fichiers vous serez l'abri. Il est facile
de renommer moncode.php en moncode.jpg. Combin
la faille CSRF (astuce visant faire raliser une t-
che de modration/administration comme surprimer un
message par un autre compte qui en possde les dro-
its) cette faille doit pouvoir crer des ravages sans que
personne ne s'en rende compte. Ensuite il suffit de re-
nommer le fichier ! Voici un bout de code si simple qui
pourrait viter bien des dfacing (action de changer le
contenu d'un site).
$alphanum = 'abcdefghijklmnopqrstuvwxyz01234
56789';
$melange = str_shuffle($alphanum);
$nouveau_nom = substr($lettres_chiffres_
melanges, 1, 8);
Il suffit d'ajouter l'extension adhquate pour que le fi-
chier puisse etre gard. S'il contient du code malicieux
comme du PHP, le fichier sera tlcharg par la naviga-
teur et non excut par le serveur.
La faille include
Certains dveloppeurs se croyant un peu plus malins,
voire plutt faignant ont dvelopps la page index de
leur site qui se consulte de cette manire : www.site.
com/index.php?page=abdcd.
Le pirate va donc proceder ainsi : il ecrit une
adresse url telle que
www.site.com/index.php?page=http://www.sitedupira-
te.com/pageultradangereuse
ou mme
www.site.com/index.php?page=admin,
en essayant plusieurs chose pour trouver la page
d'adminsitration du site. Si votre serveur utilise PHP 4,
le script du visiteur sera excut par le serveur dispo-
sant de cette faille. Pour la contrer il suffit de mettre la
fonction php allow_url_fopen OFF.
Vous pouvez aussi (sans vous passer pour autant
de la technique prcdente) modifier votre code pour
vrifier l'existance du fichier inclure :
<?php
if(isset($_GET['page']) AND file_exists($_
GET['page'].'.php'))
{
include $_GET['page'].'.php';
}
else
{
include 'default.php';
}
?>
Cependant, il faudra vrifier que le visiteur ne peux pas
inclure des pages d'administration ! Malgr tout, je vous
dconseille l'utilisation de cette mthode pour naviguer
dans votre site. Au pire, utilisez un entier pour dchiffre
chaque page. De cette manire il suffit de caster la va-
leur $_GET['page']; et crez un array numrot avec
pour valeur les noms de pages. Soyez trs prudents !
On ne le dira jamais assez.
Scurit exterieure
Nous avons maintenant vu comment amliorer la sc-
urit interne votre site web. Il y a aussi des scurits
externes : protger vos visiteurs !
La premire chose sera le mot de passe. Les visiteurs
ont des mauvaises habitudes : ils choisissent des mots
de passe communs : test, lechien, superman et d'autres...
Vous me direz que vous avez pris la protection de hasher
vos mots de passe avec MD5 ou SHA1. C'est bien ; de
grands sites ne le font mme pas. Mais ce n'est pas suf-
fisant. Imaginez qu'un hackeur arrive pntrer votre ba-
se de donnes. Il peut alors s'imprimer la liste des comp-
tes avec pseudo + mot de passe + mails. Sachez que sur
le web il existe des dictionnaires inverss comme pour
l'annuaire. Vous y mettez le hash, vous obtenez le mot
de passe ! Il faut donc empcher cela.
Lors de l'inscription du membre, vous faites srement
un :
$pass=md5($_POST['pass']);
ou
$pass=sha1($_POST['pass']);
Je vous invite choisir une sorte de cl supplmentaire
sans aucun sens tel que : KNSDI768ITDSR que vous
concatnerez avec le mot de passe du visiteur.
Listing 2. Exemple pour faille include
<?php
if(isset($ _ GET['page']))
{
include $ _ GET['page'].'.php';
}
else
{
include 'default.php';
}
?>
10/2010 54
Scurit web
NICOLAS TURMEAU
Nicolas Turmeau est tudiant en informatique (en 3me anne de li-
cence). Passionn, il dsire aussi vulgariser certaines notions pour le
plus grand public. nturmeau@iia-laval.fr.
$pass=K4NSDI768ITDSR+$_POST['pass'];
$pass=sha1($pass);
De cette manire, cela formera un hash bien diffrent
de ceux contenus dans les dictionnaires.
Certains proposent une gnration alatoire de ce
second hash puis l'insrer en base de donnes. Seu-
lement si une personne bien malhonnte arrive s'y
connecter, celle-ci aura le hash du password conca-
tn avec le hash gnr ainsi que la chane du hash
gnr... D'autres encore proposent une utilisation telle
que : md5(sha1($pass)). A chacun de voir quelle m-
thode utiliser ici.
XSS
Une autre scurit prendre en compte est lors de
l'affichage des donnes saisies dans les formulai-
res. En effet, si l'utilisateur entre du code Html ou
javascript dans un champ texte, avez vous essay
d'afficher le rsultat ? Il sera excut et croyez moi,
avec du javascript, on peut faire de trs mchantes
choses comme rediriger vers un autre site en trans-
mettant quelques informations en paramtres et voler
des sessions.
Comment afficher les informations de la base de don-
nes alors ? Je vous prsente l aussi une fonction to-
ute simple : htmlspecialchars(). Elle s'utilise simple-
ment : echo htmlspecialchars($sql['pseudo']);.
Elle chappera les caractres pouvant tre excuts
par un navigateur. Par cette mthode vous vitez ainsi
le tristement clbre Cross-Site Scripting (XSS).
Tester sa scurit
Il existe bien les tests classiques tels que les tests unita-
ires et de recette. Ceux-ci peuvent parfois s'apppliquer
aux tests de scurit grace des outils comme PHPUnit
en saisisant volontairement des donnes pouvant por-
ter atteinte votre site web. Vous pourriez bien y pren-
dre got. Vous connaissaisez le code alors tentez de
le contourner. Saisissez des url normalement rser-
ves l'administration, tentez de poster des donnes
de formulaire via POST et GET (firefox et l'addon webde-
velopper peuvent vous tre d'une grande utilit). Nous
pourrions vous recommander PhpSecInfo, Rats et bien
d'autres...
Pour aller plus loin
Vous commencez avoir de bonnes notions PHP ? Sa-
chez qu'il existe des frameworks qui peuvent vous faire
gagner du temps lors de vos dveloppements tout com-
me vous simplifier la vie pour la scurit savoir : Zend
framework, code Igniter, Symphony, et bien d'autres.
Plusieurs articles ont t publis dans les numros
prcdents sur ces frameworks. La liste n'est bien en-
tendu pas exaustive et il en existe bien d'autres tous
aussi complets que ceux nomms.
Conclusion
Cet article est loin d'tre exaustif voire mme trs loin.
La scurit est un domaine tellement vaste qu'un num-
ro complet pourrait ne pas suffire tant les attaques sont
diffrentes et voluent. J'espre cependant avoir inte-
ress votre esprit sur l'importance de la scurit dans
votre site et les futurs projets que vous aurez mener.
Perdre du temps sur la scurit, c'est aussi en gagner
l'avenir. Mditons bien cela !
Un grand merci Arnaud Lemaire pour sa relecture
trs attentive et ses remarques qui m'ont grandement
aid dans la ralisation de cet article.
www.phpsolmag.org 55
Scurit
10/2010 56
Scurit web