|
par Georges Tarbouriech <georges.t/at/linuxfocus.org> L´auteur: Georges est un vieil utilisateur d'Unix. Il apprécie tous ces produits qui ont contribué à répandre les solutions basées sur le logiciel libre dans le domaine professionnel. Traduit en Français par: Georges Tarbouriech <georges.t/at/linuxfocus.org> |
MySQL et Perl, le mariage de raisonRésumé:
MySQL et Perl font partie du paysage depuis déjà longtemps.
Ils sont toujours largement utilisés même si la "mode" est en train de
changer. Cet article parle de ces deux produits utilisés conjointement soit
sur Internet, soit sur votre réseau local. L'exemple proposé concerne les
systèmes Unix, libres ou non, même s'il peut être adapté à d'autres
"systèmes" largement répandus.
|
MySQL est un Système de Gestion de Bases de Données Relationnelles
(SGBDR) disponible sur
http://www.mysql.com. Il est publié sous licence
GNU GPL gratuitement en fonction de l'usage pour lequel il est prévu.
Vérifiez la politique de licence sur le site de MySQL. Il fonctionne en tant
que client ou serveur sur de nombreuses plate-formes. D'autres SGBDR libres
existent et nous ne ferons aucune comparaison puisque le choix de MySQL pour
cet article est purement arbitraire. De même nous ne comparerons pas avec
les "gros" produits commerciaux tels qu'Informix, Oracle, Sybase...
Précisons toutefois que MySQL est probablement l'un des SGBD les plus
utilisés sur Internet. Pour cet article nous avons choisi (toujours
arbitrairement) la version 3.23.36. Au moment d'écrire ces lignes, la
dernière version stable est la 3.23.46 et la version expérimentale est la
tant attendue version 4.0. Tout ceci peut être téléchargé sous forme de code
source à compiler ou sous forme de paquetage.
Pour utiliser MySQL avec Perl, vous aurez besoin d'autre chose : les modules
DBI de Perl. Vous devez au moins télécharger DBI, Msql-Mysql-modules, Data-Dumper
et Data-ShowTable.
Nous ne parlerons pas de leur installation puisqu'elle est évidente et que
les distributions vous fournissent tout ce que vous avez besoin de savoir.
Perl signifie Practical Extraction and Report Language. Au tout début
il était destiné à la manipulation de document (analyse, extraction...) mais
il est rapidement devenu beaucoup plus que ça. Vous pouvez pratiquement tout
faire avec Perl, depuis les tâches d'administration aux scripts cgi, en
passant par de véritables applications et bien sûr, l'interfaçage de bases
de données.
Perl fait partie de nombreuses (sinon toutes) distributions Unix, qu'elles
soient libres ou non. La version stable actuelle est la 5.6.1 et
l'expérimentale est la 5.7.2 au moment d'écrire ces lignes. Pour cet article
nous utiliserons la bonne vieille 5.005_03. Si Perl n'est pas installé sur
votre machine (comment est-ce possible ?), vous pouvez l'obtenir sur
http://www.perl.com. Perl propose des tonnes de
modules pour pratiquement tout. Vous pouvez les obtenir à partir de la
section CPAN de ce même site : une mine d'or !
Dernier point et non le moindre, pour travailler avec les deux outils
réunis, surprise : il vous faut un serveur web ! Apache semble le bon choix
puisqu'il fait partie de nombreuses distributions Unix. Si vous ne l'avez
pas (où avez-vous trouvé votre distribution ?), il est disponible à
http://www.apache.org.
Vous avez sans doute remarqué que LinuxFocus est un magazine multilingue. Ca
signifie que lorsque vous êtes un éditeur, vous devez gérer le statut des
nouveaux articles, leur traduction. En d'autres termes, qui fait quoi,
quand... Actuellement, il y a environ 200 articles, traduits en moyenne en 5
langues. Ce qui fait un millier d'articles (que je suis bon !) et ça
augmente tous les mois ! Tout cela doit être archivé, formaté, récapitulé...
Comment croyez-vous que cette gestion fonctionne ? Grâce à Perl, bien sûr.
Notre éditeur en chef, Guido Socher, a écrit de nombreux programmes en Perl
pour nous faciliter la tâche. Il a également écrit un tutoriel Perl en trois
parties ainsi que la présentation d'un livre sur Perl. Voir la partie
"Références" à la fin de l'article.
Javi, l'éditeur Espagnol, a écrit un programme pour gérer l'avancement des
traductions... en Perl.
Atif, l'un de nos auteurs étoile, vient du royaume de Perl, et c'est pour
cela que sa langue maternelle... est Perl. Accessoirement, il a également
contribué à MySQL, en améliorant un outil d'administration web. Voir
également la partie Références.
Tout cela pour dire que si vous cherchez un paradis Perl... rejoignez
LinuxFocus.
Comme je suis l'un des éditeurs Français... et que je suis plutôt paresseux,
j'ai crée ma propre base de données LinuxFocus en utilisant, devinez quoi :
MySQL et Perl !
Cela suppose que MySQL a été correctement installé, que des utilisateurs ont
été crées et ont été protégés par des mots de passe. L'installation n'entre
pas dans le cadre de cet article et la documentation d'excellente qualité
fournie avec MySQL vous dira tout.
Démarrez le serveur MySQL à l'aide du script mysql.server, puisqu'il
invoque le démon safe_mysqld auquel vous pouvez passer des options.
Connectez-vous au serveur en tapant
mysql -h host -u user -p
. Si le serveur est sur votre machine, -h host est inutile.CREATE DATABASE lf;
Il s'agit de notre exemple (lf pour LinuxFocus) et il est évident que vous donnez le nom de votre choix à votre propre base. Ensuite, garantissez certaines permissions aux utilisateurs autorisés, en supposant que vous ayez le droit de le faire (c'est-à-dire que l'utilisateur connecté posséde des droits d'administrateur). Si vous souhaitez qu'un utilisateur puisse gérer la base, vous pouvez lui en donner les privilèges en tapantGRANT ALL ON lf.* TO username;
Sélectionnez la base que vous venez de créer en tapantUSE lf
. Créez une table en fonction de vos besoins. Dans notre exemple, nous définissons une table nommée trissueCREATE TABLE trissue (num INTEGER UNSIGNED, category VARCHAR(25), title VARCHAR(40), author VARCHAR(20), en VARCHAR(20), es VARCHAR(20), fr VARCHAR(20),de VARCHAR(20), nl VARCHAR(20), ru VARCHAR(20), tk VARCHAR(20), issue VARCHAR(20));
. Vérifions qu'elle correspond bien à ce que l'on attend avec :
USE lf
SHOW TABLES;
DESCRIBE trissue;
LOAD DATA LOCAL INFILE "maindb.txt" INTO TABLE trissue;
Si votre fichier texte est correct, la table est maintenant peuplée. Vous pouvez le vérifier par :SELECT * FROM trissue;
Ceci devrait afficher une longue liste. Vous pouvez dès lors retrouver n'importe quelle donnée à l'aide de requêtes.
Perl va nous aider à automatiser les requêtes, à afficher les résultats dans
un navigateur web, etc. Encore une fois, ceci implique que les modules Perl
ont été correctement installés pour permettre l'utilisation de MySQL en
liaison avec Perl.
Nous allons maintenant écrire des scripts Perl utilisés en tant que scripts
cgi. Ils vont nous permettre de mêler Perl et HTML pour interroger la
base et formater le résultat.
Nous ne traiterons que d'un simple exemple de script, nous autorisant à
rechercher tous les articles d'un même auteur. Nous afficherons les numéros
des articles, la catégorie, le titre, les noms des traducteurs des
différentes langues (uniquement celles des projets établis), et le mois
de parution de l'article.
Vous pouvez utiliser ce script comme modèle pour votre usage personnel, mais
sachez que cet exemple n'est pas un programme particulièrement sécurisé.
Vous pouvez obtenir une version un peu plus commentée
=>ici<=.
#!/usr/bin/perl -Tw
# D'abord, disons qu'il s'agit d'un script Perl "Tainted".
#
# Ceci est un commentaire
# consultation de la base
#
# Utilisons le module Perl DBI
use DBI;
# en tant que cgi :
use CGI qw(param());
print <<END_of_start;
Content-type: text/html
<html>
<title>LFAuthors main db</title>
<center><TABLE>
<TR VALIGN=TOP>
<TD><form action="/cgi-bin/lf.cgi" method="get">
# Voici le titre du bouton de la page de lancement
<input type="submit" value=" LFAuth ">
</form>
</TD>
</TR>
</TABLE>
<center><H2>Search by author</H2></center>
<form action=\"/cgi-bin/lf.cgi\" method=\"get\">Author name : <input
type=\"text\" size=\"30\" name=\"author\"><input type=\"submit\"
value=\"Search...\"></form></center>
END_of_start
if (param("author") ne '') {
$author = param("author");
$autsrch.='"';
$autsrch.=$author;
$autsrch.='"';
# Nous nous connectons à la base nommée lf en tant qu'utilisateur untel
$dbh = DBI->connect("DBI:mysql:lf","untel",'');
$sth = $dbh->prepare("
select *
from trissue
where
author = $autsrch
");
$sth->execute;
print <<END_suite;
<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
</tr>
END_suite
while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";
}
print "</TABLE>";
print "<BR>";
print "<BR>";
print "<br>";
} else {
# Connexion à la base
$dbh = DBI->connect("DBI:mysql:lf","untel",'');
# Recherche
$sth = $dbh->prepare("
select *
from trissue
");
$sth->execute;
# Affichage du résultat
print <<SUITE;
<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Category </font></th>
<th width=110 align=CENTER><font color=#000000> Title </font></th>
<th width=110 align=CENTER><font color=#000000> Author </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Issue </font></th>
</tr>
SUITE
while( ($num,$category,$title,$author,$en,$es,$fr,$de,$nl,$ru,$tk,$issue) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $category</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $title</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $author</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $issue</td>";
print "</tr>";
}
print "</TABLE>";
print "<BR>";
}
print end_html;
$sth->finish;
# Déconnexion
$dbh->disconnect;
exit;
De toute évidence, si vous souhaitez proposer un service de base de données sur
votre site, vous devez sécuriser l'ensemble. Bien sûr, nous ne fournirons pas de
méthode pas à pas pour sécuriser votre site ou votre serveur de bases de
données. Toutefois, il est important d'insister sur ce qui est basique.
En bref, lorsque vous proposez des services sur Internet, la première chose à
faire consiste à sécuriser votre serveur web. Ceci est très loin du cadre de cet
article. Si vous voulez en savoir plus sur le sujet, il existe une énorme
documentation. Un bon endroit pour commencer n'est autre que
le Linux Documentation Project.
L'étape suivante concerne le serveur de bases de données. Lorsque vous
installez un outil tel que MySQL, n'oubliez pas de lire le chapitre sécurité
du manuel. Encore une fois, le travail de base concerne les mots de passe
des utilisateurs : ne laissez jamais un compte sans mot de passe,
particulièrement celui de root (qui devrait être différent de celui de la
machine). L'autre point important concerne les permissions : n'autorisez pas
tout à tout le monde. Cela paraît évident... et c'est la raison pour
laquelle nombreux sont ceux qui l'oublient !
Pour aller un peu plus loin, pourquoi ne pas "chrooter" la base ? Lisez
l'article de
Mark "Chrooter tous les services" dans ce numéro. Il
y parle d'une autre base mais ce qu'il dit peut être appliqué à MySQL.
Une autre mesure de sécurité concerne la circulation des données. Ce n'est
pas une mauvaise idée d'envoyer et de recevoir les données par un canal
sécurisé. Vous pouvez lire l'article
Par le tunnel pour plus ample
information.
Enfin, l'essentiel, la programmation sécurisée est l'une des clés. Perl est
un langage extraordinaire mais il est très facile de faire de grosses
erreurs de programmation avec lui. Un autre article de LinuxFocus vous dira
ce qu'il faut faire, particulièrement avec Perl. Jetez un oeil (et même les
deux)
là. C'est le dernier article de la
série sur la programmation sécurisée et il concerne plus spécialement les
scripts cgi. A lire absolument !
Alors, bien sûr, tout ceci suppose que votre système est déjà sécurisé, sans
trous de sécurité bien connus, avec tous les derniers correctifs, et avec de
nombreux outils de sécurité obligatoires tels qu'un NIDS
(Network Intrusion Detection System) comme snort (http://www.snort.org), un pare-feu, des scanners
de ports et de sécurité (nmap, nessus), etc.
Si vos moyens vous le permettent, vous pouvez aussi avoir un serveur
différent pour chaque service proposé : un serveur web, un serveur de bases
de données... et leur miroir pour garantir une haute disponibilité. Ainsi de
suite ! Ce n'est jamais fini, puisque la sécurité n'est jamais aboutie. Vous
essayez seulement de réduire les risques... et ils sont tous les jours plus
gros. Vous voilà avertis.
Comme Il Y a toujours Plus d'Une Façon de Le Faire (TIMTOWDI c'est quand même
plus parlant que IYPUFDLF), vous pouvez choisir celle qui vous convient le
mieux. Il existe de nombreux SGBDR ainsi que de nombreux langages pour
communiquer avec eux. L'idée derrière cet article était de montrer que
MySQL et Perl fonctionnent vraiment bien ensemble.
Certes, le choix était entièrement subjectif : j'adore MySQL pour sa relative
petite taille, parce qu'il fonctionne sous de nombreux OS, qu'il est rapide,
fiable... J'apprécie également beaucoup le travail de l'équipe de MySQL, sans
oublier les nombreux contributeurs. Et ce que préfère : ces gens n'ont pas
essayé de réinventer la roue. Ils ont conservé la simplicité.
Pour ce qui est de Perl, tout a été dit : que pourrais-je ajouter ? Je crois
vraiment qu'il est impossible de travailler sans lui, que vous soyez
administrateur réseau, développeur ou que sais-je. La communauté Perl est
l'un des sièges du partage des connaissances. Un magazine existe, nommé le
Perl Journal, qui est maintenant intégré au magazine SysAdmin, tous les deux
numéros. Si vous voulez vous abonner, visitez http://www.samag.com.
Puisque nous parlons de beau travail, voici l'habituelle partie hors-sujet.
Vous, lecteurs de LinuxFocus, n'avaient sans doute pas remarqué le petit nombre
de personnes investies dans le magazine. Pourtant, vous pouvez le lire dans de
nombreuses langues. Avez-vous remarqué que certaines équipes travaillent
presque toujours avec une ou deux personnes qui font tout ? Ils sont
traducteurs, webmestres, etc. Regardez du côté de l'équipe Russe ou de l'équipe
Turque : vous verrez que la plupart des articles sont traduits par Kirill ou
Erdal. Jetez un oeil sur les projets en cours de développement, tels que le
Portugais ou l'Arabe : même résultat ! J'aimerais les féliciter pour l'énorme
travail réalisé. Merci à vous tous : la communauté du logiciel libre peut vous être
reconnaissante.
Pardon pour la digression, mais je crois qu'il fallait que ce soit dit.
Pour en revenir au sujet, terminons par quelques mots sur le logiciel libre. Les
gens de MySQL et de Perl méritent un grand merci. Ils nous fournissent des
outils extraordinaires, presque toujours gratuitement. Pourtant ces outils sont
souvent aussi "bons" que les véritables produits commerciaux (sinon meilleurs),
ils sont fréquemment mis à jour, très bien documentés et vous pouvez les
utiliser sur la plupart des systèmes Unix. Connaissez-vous un équivalent
ailleurs ? J'ai bien peur que non !
Cet article ne vous apprendra sans doute pas grand chose, mais s'il vous
donne envie d'essayer ces produits, il n'aura pas été inutile.
Quand je vous dis qu'on vit une époque formidable !
Perl mongers
Le tutorial Perl de Guido :
Perl I
Perl II
Perl III
Revue du livre Programmation Professionnelle de Perl :
Programmation avec Perl
La
contribution d'Atif à MySQL.
Une revue de MySQL sur LinuxFocus : vieil article encore d'actualité :
MySQL
Un vieux tutoriel SQL en deux parties sur LinuxFocus :
SQL Partie I
SQL Partie II
Site Web maintenu par l´équipe d´édition LinuxFocus
© Georges Tarbouriech "some rights reserved" see linuxfocus.org/license/ http://www.LinuxFocus.org |
Translation information:
|
2005-01-14, generated by lfparser_pdf version 2.51