Common Gateway Interface (cgi-bin)
Transcription
Common Gateway Interface (cgi-bin)
Common Gateway Interface (cgi-bin) Passerelle entre l’utilisateur et le serveur WEB Il s’agit d’un programme externe exécuté en général, à la demande explicite de l’utilisateur, sur le serveur HTTP, et il permet de produire dynamiquement un document. Il peut prendre en entrée les informations envoyées par le navigateur (type, version, données d’un formulaire, …) et donner en sortie un document pouvant être traité par le navigateur, sauvegardé ou encore ouvert par une application sur le client. Plus généralement, CGI est en fait un standard pour l' écriture de passerelles entre des serveurs d' informations tel que HTTP et des programmes externes. L' interface CGI permet de faire communiquer le programme et le serveur HTTP. Il est noté qu’une configuration particulière du serveur est requise. L' écriture de scripts CGI nécessite donc la présence d' un serveur HTTP tournant sur la machine ou dans notre cas sur l‘appareil. En effet, n' oublions pas que c' est le serveur qui exécute le programme. Programme Pour écrire un script CGI, nous pouvons utiliser n' importe quel langage de programmation (C, bash, Perl, …). Nous devons simplement pouvoir lire sur l' entrée standard, écrire sur la sortie standard et accéder aux variables d' environnement. Rappels sur les requête HTTP. Attention il faut laisser une ligne vide à la fin pour recevoir la réponse. Requête GET index.html HTTP/1.1 Host : adresseIpDeMonDevice Réponse HTTP/1.1 200 OK Date: Tue, 26 Feb 2002 15:16:41 GMT Server: Apache/1.3.17 (Unix) PHP/4.0.4pl1 Last-Modified: Thu, 01 Apr 2004 17:05:44 GMT ETag: "3e64bc-679-3c066ae8" Accept-Ranges: bytes Content-Length: 1657 Content-Type: text/html <html> </html> Un script CGI hello.cgi #!/bin/bash echo Content-type: text/html echo echo "<html>" echo " <body>" echo " <h1>Hello World !!!</h1>" echo " </body>" echo "</html>" Appel d’un script cgi Les scripts CGI peuvent être appelés partout où il est possible de mettre une URL <a href="..."> lors d’un clic sur un lien <img src="..."> lors du chargement d’une image <form action="..."> lors de l’envoi d’un formulaire 2 méthodes : get et post Selon la méthode, les paramètres envoyés à un CGI sont disponibles : GET : dans la variable d’environnement QUERY_STRING <a href="..."> <img src="..."> <form action="..." method="GET"> La valeur de la QUERY_STRING est donc du type prix=12&nombre=2. POST : sur l’entrée standard du CGI <form action="..." method="POST"> En bash, on peut récupérer les variables sous la forme $WWW_prix et $WWW_nombre. Application de ces principes à notre cas Conditions : L’appareil doit avoir un serveur HTTP sur lequel on puisse ajouter nos propres pages. D’autre part, ce serveur doit être configurable afin d’accepter l’exécution de cgi-bin. Ces deux conditions sont donc nécessaire à l’utilisation de scripts pour notre projet. Enfin, l’utilisation d’un système de type linux est conseillé. Cas avec navigateur : On pourrait imaginer une première page contenant un formulaire nous demandant l’intensité I de la lampe avec un bouton « allumer ». Le bouton appellerait alors un fichier cgi écrit en bash (dans le cas d’un linux) qui afficherait des informations (par exemple si l’opération a marché ou non) et qui appellerait le fichier C déjà compilé. Fichier C qui contiendrait notre code pour X10 et qui pourrait prendre en paramètre la valeur de l’intensité I. La transmission de ce paramètre se ferait par la méthode POST. monfichier.html monfichier.cgi Formulaire /bin/bash Intensité I Appel de mon programme.c avec I en paramètre. 158 Allumer Méthode POST $WWW_I=158 Cas sans navigateur : Ce cas-là pourrait donc être utiliser en cas de mise en place sur un firewall. Il suffirait de faire une requête HTTP sur le en utilisant la méthode GET et en passant les paramètres dans la QUERY_STRING. Cette requête irait charger un script bash qui exécuterait dès lors notre fichier C compilé. Exemple : GET monfichier.cgi?intensité=158 HTTP/1.1 Host: adresseIpDeMonDevice Bibliographie : Cours sur les CGI et SSI de M. Malandain http://asi.insa-rouen.fr/enseignement/siteUV/technoweb/cours/cgi4.pdf Page de Frédéric COUCHET http://echo-linux.alienor.fr/articles/cgi_bin/cgi-bin.html Page de Alain et Estelle BARBET http://www.alianwebserver.com/informatique/internet/cgi/default.htm