Cet article décrit MySQL, un outil efficace pour développer des sites Web de commerce électronique et d'autres sites Web complexes et dynamiques utilisant des bases de données tierces. MySQL est un serveur SQL rapide, multithread et complet. En plus de décrire l'architecture de base du système MySQL, cet article fournit également des exemples simples écrits en Tcl et C++ pour vous aider à développer des applications Web prises en charge par des bases de données. Cet article décrit MySQL, un outil efficace pour développer des sites Web de commerce électronique et d'autres sites Web complexes et dynamiques utilisant des bases de données tierces. MySQL est un serveur SQL rapide, multithread et complet. En plus de décrire l'architecture de base du système MySQL, cet article fournit également des exemples simples écrits en Tcl et C++ pour vous aider à développer des applications Web prises en charge par des bases de données.
Une application qui doit stocker ou accéder à de grandes quantités d’informations peut grandement bénéficier de l’utilisation d’un produit de base de données tiers. Cela est particulièrement vrai lorsque l'accès aux informations doit s'effectuer sur plusieurs instances du programme. Les applications basées sur le Web (y compris le commerce électronique) en sont de bons exemples.
Pourquoi utiliser une base de données autonome ?
Les serveurs Web doivent disposer d'un moyen permettant à leurs scripts de traitement de stocker des informations sur leur état pour un accès ultérieur. Bien qu'il soit possible d'utiliser des méthodes plus primitives - telles que le dumping dans un fichier texte ou le développement d'une mini-base de données maison - seule une application de base de données à part entière peut fournir tous les services requis par une application Web plus complexe. Il n'y a pas beaucoup d'avantages à écrire un moteur de base de données personnalisé spécifique à une application, car il existe des progiciels disponibles gratuitement à cet effet. De plus, l’utilisation d’une base de données tierce élimine également le besoin pour les développeurs Web de se consacrer à la tâche de développement et de maintenance d’une base de données.
Base de données MySQL
L'intégration de bases de données dans des applications Linux peut être assez simple grâce à l'utilisation de langages de script et de langages système compilés tels que C. La base de données MySQL disponible gratuitement (distribuée sous licence publique GNU) fournit un ensemble sophistiqué de fonctions SQL et est facile à intégrer dans les applications. MySQL est rapide, multithread et prend en charge les normes ANSI et ODBC SQL. En collaboration avec des logiciels tiers, MySQL prend en charge les tables sécurisées pour les applications de traitement des transactions.
Remarque : Qu'est-ce que le traitement des transactions ?
Une transaction est une série de modifications apportées à une base de données qui doivent être effectuées de manière atomique. Soit tous doivent être exécutés, soit aucun d’entre eux ne doit être exécuté. Par exemple, toutes les modifications nécessaires à la base de données lors de la vente d'un produit sur le Web forment une seule transaction.
La base de données doit soustraire à la fois le solde du compte client et l’inventaire des produits, sinon elle échoue et aucune opération n’est effectuée.
Une panne de serveur, quelle qu'en soit la raison, ne devrait pas entraîner l'exécution partielle des transactions. Par exemple, une surfacturation, des produits non livrés ou un inventaire inexact peuvent être le résultat de transactions partiellement réalisées.
Une base de données qui prend en charge le traitement des transactions peut encapsuler un ensemble de codes de base de données dans une transaction. Tout échec lors de l'exécution de la transaction entraînera le retour de la base de données à l'état précédant le démarrage de la transaction.
Ceci est réalisé en conservant un journal de toutes les opérations de la base de données, ainsi qu'une copie de sa table d'état d'origine, permettant les opérations de restauration au prochain redémarrage du serveur après une panne. Cette surcharge de temps et d'espace est un compromis nécessaire pour un système de base de données sécurisé pour les transactions.
Un seul serveur MySQL contrôle une série de bases de données, qui sont toutes accessibles de la même manière via le serveur. Chaque base de données est en fait un ensemble d'un nombre quelconque de tables, dont le concept est similaire à celui des utilisateurs d'autres bases de données SQL. Chaque table est constituée de colonnes de données saisies. Les données peuvent être des entiers, des valeurs réelles, des chaînes ou d'autres types, y compris des flux binaires bruts. Chaque ligne du tableau est un enregistrement stocké dans la base de données.
MySQL est conçu et structuré comme un client/serveur. Le serveur mysqld peut fonctionner sur n'importe quelle machine accessible depuis Internet (de préférence sur la même machine que le serveur Web ou le plus près possible pour garantir des temps de réponse raisonnables). Le client MySQL utilise des requêtes pour contacter le serveur MySQL afin de modifier ou d'interroger la base de données appartenant au serveur. Dans une application Web prenant en charge la base de données, le client de base de données est le serveur Web ou un script CGI généré par le serveur Web. Ces clients peuvent être écrits dans un langage de script de haut niveau ou dans un langage système de bas niveau, à condition qu'une API de base de données existe pour ce langage. Sous Linux, la plupart des langages de script sont implémentés en C, et puisque l'API MySQL C existe, il devrait être facile d'ajouter la prise en charge de MySQL à n'importe quel langage ou outil de script existant. La plupart des langages de script ont déjà franchi cette étape.
API MySQL
L'API MySQL est disponible dans une variété de langages, y compris presque tous les langages réellement utilisés pour écrire des backends de sites Web. En utilisant ces API, nous pouvons créer un client MySQL contrôlé par un serveur Web.
L'API (pour l'accès à la base de données) fonctionne en mode basé sur la connexion. La première chose que le client doit faire est d'ouvrir une connexion au serveur MySQL. Cela inclut l'authentification appropriée de la connexion à l'aide d'un nom d'utilisateur et d'un mot de passe connus du serveur. Une fois la connexion établie, le serveur sélectionne une base de données spécifique à utiliser. Une fois l'initialisation déterminée, l'application client (dans notre cas, le script CGI côté serveur) est libre d'interagir avec la base de données de deux manières : elle peut exécuter des commandes SQL classiques, notamment l'ajout et la suppression de tables, et ajouter des enregistrements à eux ; vous pouvez également exécuter des requêtes sur la base de données qui renvoient des résultats. La requête génère un ensemble d'enregistrements qui correspondent à la requête, et le client peut ensuite accéder aux enregistrements un par un jusqu'à ce que tous les enregistrements aient été visualisés ou que le client annule la récupération des enregistrements en attente. Une fois que le script a fini de travailler avec la base de données, la connexion au serveur est fermée.
Pour créer un site Web intégrant l'accès à la base de données, vous devez écrire des scripts CGI pour générer des résultats dynamiques basés sur l'état de la base de données. Les serveurs Web lancent des scripts CGI, puis génèrent du HTML correctement formaté vers leur flux de sortie standard. Le serveur Web capture le code HTML et le renvoie au client comme si la demande concernait une page HTML statique. Lors du processus de génération HTML, les scripts peuvent modifier la base de données ou interroger et incorporer les résultats dans leur sortie.
A titre d'exemple pour expliquer brièvement le processus ci-dessus, le code suivant (écrit en C et Tcl) interroge une base de données contenant une liste de produits à vendre par une entreprise. Celui-ci n'utilise en aucun cas toutes les fonctionnalités de l'API MySQL dans les deux langages, mais fournit un exemple rapide et facilement extensible pouvant exécuter n'importe quelle commande SQL sur le contenu de la base de données. Dans cet exemple, le script affiche tous les produits en dessous d'un prix spécifique. En pratique, l'utilisateur peut saisir le prix dans un navigateur Web puis l'envoyer au serveur. Nous avons laissé de côté les détails de la lecture des variables d'environnement pour déterminer les valeurs du formulaire HTML, car ce n'est pas différent de l'exécution dans un script CGI qui ne prend pas en charge une base de données. Par souci de clarté, nous supposons que certains paramètres (comme le prix à consulter) sont fixés à l'avance.
Le code suivant est implémenté dans Tcl à l'aide de l'interface de base de données générique Tcl disponible gratuitement. L'avantage d'une telle interface est que Tcl est interprété et peut rapidement développer et modifier le code.
Exemple Tcl
#Ce code imprime tous les produits de la base de données
# qui sont inférieurs à un prix spécifié (supposé avoir été déterminé
# au préalable, et stocké dans la variable targetPrice)
# La sortie est au format de tableau HTML, approprié pour la sortie CGI
#charger la bibliothèque d'objets partagés SQL, l'interpréteur Tcl pourrait également.
#ont été compilés avec la bibliothèque, rendant cette ligne inutile
charger /home/aroetter/tcl-sql/sql.so
#ceux-ci sont bien définis au préalable, ou ils pourraient
#être passé dans le script
définir DBNAME "clientWebSite" ;
définir TBLNAME "produits" ;
définir DBHOST "backend.company.com"
setDBUSER "utilisateurmysql"
définir DBPASSWD "abigsecret"
définir le prix cible 200 ;
#se connecter à la base de données
définir le handle [sql connect $DBHOST $DBUSER $DBPASSWD]
sql selectdb $handle $DBNAME ;# obtenir la base de données de test
#exécuter une requête en utilisant le code SQL spécifié
requête SQL $handle "select * from $TBLNAME où prix <= $targetPrice"
#imprimer l'en-tête du tableau HTML
met "<table border=4>"
met "<th>ID du produit <th width=200>Description <th>Prix ($)"
#lignes de la table de sortie - chaque fetchrow récupère un résultat
#à partir de la requête SQL
while {[set row [sql fetchrow $handle]] != ""} {
définir l'identifiant du produit [lindex $ligne 0]
définir la description [lindex $row 1]
prix fixe [lindex $ligne 2]
met "<tr><td>$prodid <td align=center>$descript <td>$price"
}
met "</table>"
#vider le tampon des résultats de la requête - devrait déjà être vide dans ce cas
requête de fin SQL $handle
#fermer la connexion à la base de données - en pratique cette même connexion
#est utilisé pour plusieurs requêtes
sql déconnexion $handle
Le code ci-dessous est le script équivalent écrit en C++ à l'aide de l'API MySQL C++ officielle MySQL++. L'avantage de cette version est qu'elle est compilée et donc plus rapide que les langages interprétés. Le code de la base de données fréquemment utilisé sur un site spécifique doit être écrit en C ou C++, puis accessible par des scripts ou directement depuis le serveur Web pour améliorer le temps d'exécution global.
Exemple C++
#inclure
#inclure
#inclure
const char *DBNAME = "clientWebSite";
const char *DBTABLE = "produits";
const char *DBHOST = "backend.company.com";
const char *DBUSER = "mysqluser";
const char *DBPASSWD = "abigsecret":
int main() {
essayer {
//ouvre la connexion à la base de données et interroge
Connexion avec (DBNAME, DBHOST, DBUSER, DBPASSWD);
Requête requête = con.query();
//écrit du code SQL valide dans l'objet de requête
requête << "sélectionner * dans " << DBTABLE ;
// exécute la requête et stocke les résultats
Résultat res = query.store();
//écrit l'en-tête du tableau HTML
cout << "<table border=4>n";
cout << "<th>ID du produit <th width=200>Description"
<< "<th>Prix ($)" << endl;
Résultat :: itérateur curResult ;
Rangée de rangée ;
// parcourez chaque résultat et placez-le dans un tableau HTML
pour (curResult = res.begin(); curResult != res.end(); curResult++) {
rangée = *curResult;
cout << "<tr><td align=center>" << rangée[0]
<< "<td>" << ligne[1]
<< "<td>" << rangée[2] << endl;
}
cout << "</table>" << endl;
} catch (jeu BadQuery) {
// gère une mauvaise requête (généralement causée par une erreur de syntaxe SQL)
cerr << "Erreur : " << er.error << endl;
renvoie -1 ;
} catch (BadConversioner) {
// gère également les erreurs de conversion en dehors de la base de données
cerr << "Erreur : Impossible de convertir "" << er.data << "" en ""
<< er.type_name << ""." << endl;
renvoie -1 ;
}
renvoie 0 ;
}
sécurité
La création d'applications Web sur le Web présente certains problèmes que les développeurs doivent prendre en compte. Tous les problèmes liés aux programmes CGI sur le serveur Web, tels que les autorisations de traitement du serveur Web et les contrôles d'entrée côté script, doivent toujours être pris en compte.
De plus, il est également nécessaire de maintenir la sécurité du système de base de données. Cela implique de sécuriser le système d'autorisations du serveur de base de données et de sécuriser les connexions des clients de base de données au serveur.
MySQL fournit un système de sécurité approfondi que certaines personnes décrivent comme « avancé mais pas standard ». MySQL autorise l'accès client en fonction du nom d'utilisateur, de l'hôte client et de la base de données. Pour créer un système sécurisé, demandez à tous les utilisateurs d'utiliser des mots de passe forts et ne leur accordez aucun accès dont ils n'ont pas absolument besoin. Cela inclut des privilèges apparemment inoffensifs tels que les privilèges de gestion qui permettent à un utilisateur de visualiser tous les processus en cours, y compris ceux qui modifient les mots de passe des autres utilisateurs. La meilleure approche consiste à exécuter le processus serveur lui-même en tant qu'utilisateur Unix non privilégié afin que si une base de données est compromise, cela ne fasse pas tomber l'ensemble du système. Ceci revient à exécuter httpd en tant qu'utilisateur personne au lieu de root. Les tableaux décrivant l'accès au système sont stockés dans des bases de données MySQL distinctes et peuvent être mis à jour par l'utilisateur root MySQL. Notez que le serveur MySQL accorde des privilèges basés sur les noms d'utilisateur MySQL, qui sont différents des noms d'utilisateur Unix. Cependant, il existe un nom d'utilisateur root MySQL, qui dispose de toutes les autorisations sur la base de données. Une fois que le serveur a déterminé qui sont les clients qui se connectent et à quoi ils tentent de se connecter, l'accès est contrôlé en fonction d'un ensemble d'autorisations donné. Pour éviter que les noms d'hôtes de la table d'accès ne soient usurpés par DNS, vous pouvez saisir les adresses IP de tous les hôtes ou demander au serveur de résoudre les adresses IP en noms d'hôtes d'origine afin de rendre plus difficile l'interception des requêtes et des réponses DNS par d'autres. .
Outre les tables d'accès au serveur, la communication avec le serveur doit également être sécurisée. Lors de la connexion au serveur à partir du client, le mot de passe n'est pas envoyé en texte brut ; cependant, toutes les commandes SQL ultérieures seront envoyées en texte brut ; Pour plus de sécurité, utilisez ssh pour configurer la redirection de port. Il crypte toutes les communications entre le serveur et le client, empêchant quiconque de les observer en transit. Les données du client sont envoyées au port de la machine locale du client où le serveur ssh local écoute. Il est utilisé par le serveur ssh local, chiffré et envoyé au serveur ssh distant, qui le déchiffre et le transmet au port du serveur MySQL.
En pratique, l'approche la plus sûre consiste à exécuter le serveur de base de données sur la même machine que le serveur Web et à laisser les scripts CGI générés par le serveur Web communiquer avec le serveur MySQL via des sockets UNIX (natifs). Ce paramètre permet à l'administrateur de la base de données de désactiver toutes les connexions distantes au serveur MySQL. Si les serveurs Web et de base de données doivent se trouver sur des machines différentes, chiffrez toutes les communications entre eux ou connectez les deux machines via leurs propres réseaux dédiés et physiquement isolés. Créez un seul compte utilisateur (autre que l'utilisateur root) utilisé par le serveur Web pour vous connecter au serveur de base de données.
Les sites Web basés sur des bases de données sont des outils puissants qui permettent aux développeurs de créer des sites dynamiques qui fournissent des informations mises à jour et permettent aux modifications initiées par le client de persister sur plusieurs sessions. L'utilisation de bases de données back-end est essentielle pour gérer les utilisateurs du commerce électronique et d'autres applications. En utilisant un logiciel disponible gratuitement, il est possible de créer un site basé sur une base de données qui intègre en toute sécurité la connectivité de la base de données dans l'architecture CGI existante du site.