Introduction
La Common Gateway Interface (CGI) est une norme définissant l'interfaçage d'applications externes avec des serveurs d'information (dans le cas qui nous intéresse: des serveurs HTTP).
La motivation qui vous conduira à utiliser CGI pour faire appel à des programmes externes est la suivante: lorsqu'un document HTML est envoyé sur le Web, il s'agit d'un document statique, un fichier texte dont l'information ne change pas tant que vous n'avez pas édité ledit fichier. Il existe néanmoins un grand nombre de cas où vous aimeriez envoyer de l'information dynamique, voire changeante d'un instant à l'autre. Un programme externe appelé par CGI ("programme CGI") permet d'arriver à ce résultat dans la mesure où ce programme est exécuté en temps réel, au moment où le client fait une requête au serveur HTTP.
Imaginez par exemple que vous vouliez connecter votre base de données sous UNIX au World Wide Web de manière à ce que les gens du monde entier puissent l'interroger en temps réel. Pour ce faire, vous pouvez créer un programme CGI que le serveur HTTP invoquera pour transmettre des critères de recherche au moteur de votre base de données et recevoir les résultats de la recherche qu'il transmettra alors au client pour affichage. Ceci est un exemple typique de passerelle - gateway en anglais - d'où le nom de Common Gateway Interface.
Cet exemple de base de données est une idée relativement simple mais néanmoins assez délicate à implémenter dans les faits. Il existe en fait un grand nombre d'applications beaucoup plus simples de CGI, par exemple: inclure l'heure courante dans un document HTML. Mais il n'y a pratiquement aucune limite à ce que vous pouvez faire avec un programme CGI. Rappellez vous simplement que votre programme est exécuté en direct et ce que vous y faites ne doit donc pas prendre trop de temps, faute de quoi l'utilisateur ne ferait rien d'autre que d'attendre devant un écran vide que votre programme veuille bien envoyer de l'information.
Spécification
Etant donné qu'un programme CGI est un exécutable, son utilisation correspond quasiment à laisser n'importe qui dans le monde e xécuter un programme sur votre ordinateur... ce qui n'est pas précisément la chose la plus sûre à faire (piratage, malveillance, virus...). Cela induit la nécessité de prendre quelques précautions au niveau de la sécurité.
L'une des précautions qui affectera le plus la plupart des utilisateurs est le fait que tous les programmes CGI devront généralement être placés dans un repértoire spécifique de l'arborescence, généralement nommé cgi-bin
. Lorsque le serveur reçoit alors une requête sur une URL du type http://www.dom.org/cgi-bin/prog.html
il saura qu'il doit exécuter le programme nomméprog.html
plutôt que de l'envoyer tel quel vers le client comme on aurait pu s'y attendre à la vue de l'extension .html
. En effet, tout fichier se trouvant dans le répertoire cgi-bin
sera considéré par le serveur HTTP comme étant un exécutable.
D'autre part, le répertoire cgi-bin
est généralement contrôlé par l'administrateur du serveur. Cela a deux conséquences:
- N'importe qui ne peut pas créer un programme CGI et l'administrateur du serveur peut vérifier leur sécurité avant de les rendre accessible au public.
- Le serveur HTTP n'exécutera que les programmes se trouvant dans ledit répertoire ou l'un de ses sous-répertoires et n'exécutera jamais un programme placé ailleurs sur vos disques. Cela empêchera un individu malveillant d'éxécuter n'importe lequel des programmes figurant sur votre ordinateur depuis l'autre bout de la planète. Cela empêchera également n'importe quel utilisateur (par exemple vous!) autorisé à placer des pages HTML sur un serveur d'y placer également des programmes CGI sans visa de l'administrateur.
Il existe d'autres moyens de faire éxécuter un programme CGI par votre serveur HTTP, mais seul l'administrateur du serveur peut les mettre en place. Un administrateur particulièrement laxiste laissera par exemple son serveur exécuter n'importe quel fichier possèdant l'extension .cgi
.
En pratique, les utilisateurs peuvent souvent placer librement des documents statiques (pages HTML, images, etc.) sur le serveur Web de leur organisation en les copiant dans un répertoire spécial. Par contre, ils ne peuvent généralement pas rendre leurs programmes accessibles par le Web en utilisant CGI parce qu'ils n'ont pas la permission de les copier dans le répertoire cgi-bin.
Dans la majorité des cas, vous devrez donc vous adresser à l'administrateur de votre serveur WWW pour installer un programme CGI... à moins que vous ne soyez administrateur de serveur vous même!
Un programme CGI peut être écrit dans la plupart des langages disponibles sur vot re système. Les seules conditions sont que le langage en question vous donne accès aux variables d'environnement et qu'il permette d'écrire sur la sortie standard. Parmi les langages que vous pouvez utiliser vous trouverez:
- C et C++
- Fortran
- Perl
- TCL
- sh, csh, ksh ou n'importe quel autre shell UNIX
- Visual Basic (sous Windows)
- AppleScript (sur Macintosh)
Si vous utilisez un langage de programmation tel que C, C++ ou Fortran, vous savez que vous devez compiler vos programmes avant de pouvoir les exécuter. Par contre, si vous utilisez un langage de script tel que Perl, TCL ou un shell UNIX, vous pouvez directement exécuter le fichier source (pour être précis, on doit dire que le fichier source sera interprété).
Attention: Dans tous les cas, vérifiez que le fichier à exécuter possède bien une permission d'exécution, en particulier si vous êtes sous UNIX.
Beaucoup de personnes préfèrent écrire leurs programmes CGI sous forme de scripts plutôt que sous forme de programmes compilés. En effet, sous forme de scripts, ils sont plus faciles à débugguer, à modifier et à maintenir. Un autre avantage du script est que l'administrateur du serveur peut vérifier facilement que ledit script n'ouvre pas de brèche dans la sécurité du système. Un script interprété induit néanmoins une sérieuse dégradation de performances par rapport à un programme compilé.
Exemples
Voici deux exemples relativement simples de scripts CGI.
- Date courante est un script CGI extrêmement simple qui produit un document HTML contenant la date et l'heure courantes.
Le code source est écrit ensh
. - Interface finger est un script CGI un peu plus compliqué qui prend un paramètre en entrée. Si aucun paramètre n'est fourni, le script affiche un champ ISINDEX pour que l'utilisateur saisisse un nom. Une fois que ce nom est saisi, le script s'appelle lui même à nouveau, mais cette fois, le nom saisi est transmis en argument. Dans ce cas, c'est à dire lorsque le script est appelé avec un argument, il appelle la commande UNIX
finger
et intègre le résultat de cette commande dans la document HTML qu'il produit.
Le code source est écrit ensh
.