Qu’est-ce que l’interface de passerelle commune (CGI)? –
L’interface de passerelle commune (CGI) est une norme définissant la manière dont les programmes externes peuvent fournir des informations aux serveurs Web. CGI fournit un mécanisme permettant aux serveurs Web comme Apache d’échanger des données avec des langages de programmation tels que Perl.
CGI est l’un des composants les plus anciens de l’infrastructure Internet. Il est encore largement utilisé aujourd’hui, bien qu’il ait été remplacé par de nouvelles alternatives.
Les logiciels de serveur Web étaient traditionnellement limités à la diffusion de pages Web statiques. Les scripts CGI ont permis la production de dynamique réponses, créées lors de la réception d’une demande.
Sommaire
Standardisation des serveurs HTTP
CGI a été conçu pour fournir un moyen normalisé aux langages de programmation d’accéder aux informations du serveur HTTP. Tout serveur HTTP peut être associé à n’importe quel langage de programmation, à condition qu’ils respectent tous les deux les spécifications CGI.
Les serveurs compatibles CGI traiteront les demandes en utilisant un processus similaire au suivant:
- Une nouvelle demande est reçue:
/example.pl
. - Le serveur Web reconnaît
example.pl
en tant que script CGI exécutable, il appelle donc le script. - Le script Perl CGI reçoit toutes les données sur la requête, telles que son URL et ses en-têtes HTTP.
- Le
example.pl
le script s’exécute; sa sortie sera renvoyée au serveur Web pour émission en tant que réponse HTTP.
Le flux décrit ci-dessus contraste fortement avec le fonctionnement normal d’un serveur Web. Une demande de base pour /example.pl
renverrait le contenu de ce fichier. Si le fichier n’existait pas, vous recevrez un 404
réponse à la place.
Lors de l’utilisation de CGI, une requête n’a pas besoin d’être mappée à un fichier réel sur le disque. Au lieu de cela, un programme défini par l’utilisateur est exécuté. Le programme a la responsabilité de générer la sortie à envoyer au client. Le serveur Web n’est plus concerné par le contenu réel de la réponse.
Informations échangées via CGI
Le programme binaire exécuté via CGI peut accéder à diverses données sur la requête HTTP entrante. Cela inclut l’URL, les en-têtes, la chaîne de requête et la méthode HTTP, ainsi que l’adresse IP du client distant.
Le logiciel serveur n’est pas nécessaire pour fournir toutes les données textuellement. La spécification CGI permet aux serveurs d’exclure les en-têtes des variables d’environnement. Cela peut être d’omettre des informations sensibles – telles que la valeur de la Authorization
en-tête – ou pour éviter la redondance lorsque les mêmes informations peuvent être accédées à l’aide d’une variable dédiée.
En plus des données relatives à la demande, les serveurs compatibles CGI doivent également indiquer divers détails les concernant. Cela inclut le nom et la version du logiciel du serveur hôte. Les scripts peuvent utiliser ces détails comme bon leur semble.
Les informations sont transmises du serveur au programme CGI en tant que variables d’environnement. Le programme y accède de la même manière que toute autre variable d’environnement. Le serveur exécutera le programme en tant que processus enfant de lui-même, définissant les variables d’environnement avant d’appeler l’exécutable.
Il y a une donnée qui ne sera pas transmise en tant que variable d’environnement. Le corps de la demande reçoit un traitement spécial, car il peut être extrêmement long. Cela sera redirigé vers le script sur son flux d’entrée standard. Les scripts sont informés de la quantité de données disponibles via le CONTENT_LENGTH
variable d’environnement.
Une fois le traitement du script terminé, le script CGI renvoie une réponse HTTP au serveur. Il doit s’agir d’une réponse HTTP complète comprenant des en-têtes et un corps facultatif. Le script émet la réponse à son flux de sortie standard. Le serveur renvoie ensuite la réponse au client via la connexion HTTP.
Où est CGI aujourd’hui?
CGI a contribué à la création du Web moderne. Il a fourni un moyen extrêmement simple de créer des scripts dynamiques côté serveur en utilisant les technologies du milieu des années 90. Une page Web n’était plus un fichier HTML statique.
La simplicité de CGI l’a aidée à perdurer au cours des décennies qui ont suivi. Les scripts CGI restent utilisés, en particulier dans les applications héritées basées sur des langages plus anciens. La technologie ne s’est pas arrêtée cependant; CGI a été remplacé par des alternatives plus modernes qui sont mieux adaptées au Web d’aujourd’hui.
La CGI traditionnelle crée une surcharge qui devient problématique à grande échelle. Le script CGI est rechargé à chaque demande, engendrant un nouveau processus qui peut épuiser les ressources sur les sites à fort trafic.
CGI est également limité en termes de contrôle qu’il fournit aux scripts. Les scripts ne peuvent déterminer que le contenu de la réponse renvoyé au client. Ils ne peuvent influencer aucune autre partie de l’échange HTTP, telle que l’authentification ou la gestion de session.
Enfin, il y a des problèmes de sécurité. Les scripts CGI sont généralement exécutés en tant que processus enfant du serveur. Cela signifie que le serveur doit être protégé contre les interférences de script. Une mauvaise configuration peut donner à un script un accès indésirable à d’autres ressources gérées par le serveur, telles que sa configuration et ses fichiers journaux.
De nombreux problèmes de CGI ont été résolus par les nouvelles technologies d’interface. FastCGI a été créé pour réduire le problème des frais généraux de CGI. Il fonctionne de la même manière que CGI mais ne génère pas de nouveau processus pour chaque requête. Au lieu de cela, le serveur FastCGI fonctionne indépendamment du serveur Web, en conservant son propre ensemble de processus persistants utilisés pour héberger les scripts CGI.
Ailleurs, les langages de programmation individuels ont implémenté leurs propres interfaces de serveur. Ceux-ci sont directement intégrés aux serveurs Web, généralement via des modules optionnels. Un exemple est celui d’Apache mod_php
et mod_perl
, qui offrent un support natif pour ces langages de programmation sans utiliser CGI (même si les deux peuvent être utilisés via CGI).
Malgré l’émergence de ces mécanismes, CGI reste pertinente. La simplicité au cœur de sa conception a éclairé la plupart des efforts ultérieurs visant à améliorer l’architecture globale. Bien qu’il soit peu probable que vous rencontriez CGI au quotidien dans les systèmes Web modernes, les principaux serveurs Web continuent de le prendre en charge et il est peu probable que cela change de si tôt.