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