CGI et SSI. La programmation CGI. Sources. Objectifs. Qu'est ce qu'un programme CGI? CGI

Please download to get full document.

View again

of 8
75 views
PDF
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Document Description
Sources CGI et SSI Supports de cours de Olivier Glück (Lyon 1) Livres cités en bibliographie Le web Sylvain Brandel M1 Informatique
Document Share
Documents Related
Document Transcript
Sources CGI et SSI Supports de cours de Olivier Glück (Lyon 1) Livres cités en bibliographie Le web Sylvain Brandel M1 Informatique MIF13 Programmation web Université Claude Bernard Lyon 1 UFR d informatique 2 Règle n 1 : Rendre à César Les transparents et images proviennent essentiellement des sources citées Objectifs Programmation CGI Premier exemple, méthodes GET / POST Format URL encodé, format de la sortie standard, les variables d'environnement Les langages de programmation Configuration du serveur HTTP, sécurité Exemple du compteur de visiteurs Les Server Side Includes (SSI) Principe et mise en place Directives et variables Expressions conditionnelles La programmation CGI 3 CGI : Common Gateway Interface CGI Interface de base qui définit la communication entre le serveur HTTP un programme d'application Sur le serveur un programme s'exécute ce programme génère des pages HTML dynamiques CGI spécifie comment des navigateurs clients peuvent communiquer avec ces programmes Qu'est ce qu'un programme CGI? S'exécute sur le serveur web Compilé (binaire) ou interprété (script) Permet de récupérer les données du formulaire à l'aide d'un parser : pour chaque champ, un couple NAME / VALUE est transmis au serveur effectuer des traitements sur le serveur lecture / écriture dans une base de données stockage d'informations (compteurs, identifiant de connexion...) recherche d'informations pied de page automatique (ex: date de dernière modification) générer un résultat qui est renvoyé au client page HTML, image, document postcript Avantages / inconvénients Puissant mais dangereux le démon http peut tout exécuter sur le serveur Un CGI doit s'exécuter rapidement risque de surcharge du serveur Le temps de génération de la page peut être long : pendant que le CGI s'exécute, le client attend la réponse sans savoir pourquoi elle n'arrive pas... possibilité d'envoyer dès le début de l'exécution une page qui permet d'indiquer à l'utilisateur que le résultat va arriver Source du programme CGI Un premier exemple (1) #!/bin/sh # date.cgi Content-type: text/html #Creation du corps du document html head title date.cgi /title /head body h1 date sur le serveur /h1 -n On est le `date +%D`, il est `date +%H`h `date +%M`m /body /html Exécution du CGI sur le serveur Content-type: text/html 7 8 html head title date.cgi /title /head body h1 date sur le serveur /h1 On est le 12/05/07, il est 19h 05m /body /html Exécution du CGI depuis un client Un premier exemple (2) Un premier exemple (3) Ce programme CGI n'utilise aucune donnée en provenance du client récupère la date sur le serveur affiche sur sa sortie standard le code d'une page HTML minimale contenant la date et l'heure Content-type information destinée au serveur pour la construction de l'en-tête HTTP (réponse renvoyée au client) Content-type: text/html : indique que le type des données générées par le CGI est une suite de commandes HTML 9 10 Méthode GET les données relatives aux champs du formulaire sont transmises via l'url (dans le type de la requête) le programme CGI les récupère dans la variable d'environnement QUERY_STRING Actualiser retransmettre les données Définir un bookmark possible Données visibles dans les logs du serveur Méthode GET Exemple # get_post.cgi 'Content-type: text/plain' QS=$QUERY_STRING read DATA Data=$DATA 2 Méthode POST Méthode POST Les données relatives aux champs du formulaire sont transmises dans le corps de la requête HTTP Content-type et Content-length positionnés Programme CGI récupère les données sur l'entrée standard Actualiser impossible bookmark impossibles Données du formulaire non visibles dans les logs du serveur Méthode POST Exemple Méthodes GET / POST html head title get et post /title /head body form name= f1 method= get action= http://b710l110.univ-lyon1.fr:8080/get_post.cgi input name= value= entrez votre ici size= 30 maxlength= 50 /input br br input type= password name= pass value= entrez votre passwd ici size= 8 maxlength= 8 /input br br input type= submit name= s value= login /input /form /body /html 15 # get_post.cgi 'Content-type: text/plain' QS=$QUERY_STRING read DATA Data=$DATA 16 Méthodes GET / POST Format URL encodé (1) Méthode GET Méthode POST Coder les données de l'url (méthode GET) sur le client pour construire la chaîne CGI respecter la RFC 2396 : syntaxe des URL Caractères non-alphanumériques remplacés par %xx (xx = code ASCII du caractère en hexadécimal) Les caractères réservés : ; /? & = + $,? : début de QUERY_STRING & : séparateur de champ = : séparation entre le nom du champ et sa valeur Les espaces sont remplacés par des Format URL encodé (2) Format de la chaîne CGI nom_champ1=valeur1&nom_champ2=valeur2&... Cas des champs à valeurs multiples exemple : listes à sélection multiples nom_liste=valeur1&nom_liste=valeur2&... La chaîne CGI construite par le client au format URL-encoded quand la requête est postée transmise au CGI telle quelle via la variable d'environnement QUERY_STRING avec la méthode GET telle quelle via l'entrée standard avec la méthode POST Format de la sortie standard d'un CGI En-tête, ligne vide, Corps Content-type: type/subtype (type MIME du corps) Window-target: frame (fenêtre de réception du résultat) Location: URL (redirection vers une autre URL) Status: code msg (code de la réponse HTTP) HTML ... /HTML Location doit être utilisé seul par exemple pour utiliser un moteur de recherche existant En-tête minimale : Content-type Non parsed headers Non parsed headers Exemple Fonctionnement normal le serveur HTTP exécute entièrement le CGI puis génère l'en-tête finale de la réponse (après la fin de l'exécution) pour pouvoir générer Content-length Non parsed header le CGI génère complètement l'en-tête HTTP de la réponse, y compris le code de retour le serveur HTTP n'analyse plus les en-têtes générés par le CGI permet d'envoyer une partie du résultat avant que l'exécution du CGI ne soit terminée faire patienter le client convention de nommage du CGI : nph-moncgi.cgi # nph_nonstop.cgi 'Content-type: text/html' ' html header title nph-nonstop.cgi /title /header body ' Toutes les deux secondes, j'affiche l'heure br cliquer sur STOP pour m'arreter! while true do sleep 2 br il est `date +%H`h`date +%M`m`date +%S` done Les variables d'environnement Elles sont positionnées par le serveur HTTP pour fournir au CGI des infos sur le serveur, le client... AUTH_TYPE : authentification méthode d'authentification de l'utilisateur s'il y a lieu CONTENT_LENGTH : lg (en hexa) longueur des données véhiculées dans la requête (POST) CONTENT_TYPE : type/subtype (application/x-www-form-urlencoded) type MIME des données véhiculées dans la requête GATEWAY_INTERFACE : CGI/version (CGI/1.1) version des spécifications CGI utilisées par le serveur HTTP_ACCEPT, HTTP_USER_AGENT,... HTTP_XXX une variable pour chaque champ contenu dans l'en-tête HTTP PATH_INFO : path chaîne entre SCRIPT_PATH et QUERY_STRING dans l'url QUERY_STRING : nom1=val1&nom2=val2... données transmises au CGI via l'url (GET) REMOTE_HOST : nom nom de la machine d'où vient la requête REMOTE_ADDR : adresse_ip adresse IP de la machine d'où vient la requête REMOTE_USER : login si authentification, nom de l'utilisateur associé à la requête REMOTE_IDENT : login_os login de connexion de l'utilisateur (pas souvent supporté) REQUEST_METHOD : method (GET/POST/...) méthode associée à la requête en cours de traitement SCRIPT_NAME : nom (/cgi-bin/mon_cgi.cgi) chemin du CGI à partir de la racine du serveur HTTP SERVER_PORT : port numéro du port (TCP) vers lequel la requête a été envoyée SERVER_NAME : nom nom ou adresse IP de la machine serveur HTTP SERVER_PROTOCOL : protocole/version (HTTP/1.1) protocole et version de la requête en cours de traitement SERVER_SOFTWARE : nom/version nom et version du démon HTTP Les variables d'environnement Programme CGI en perl qui affiche les variables d'environnement qui sont transmises au CGI #! /usr/bin/perl # env.cgi print Content-type: text/html\n\n ; foreach $v (sort(keys(%env))) { print $v -- $ENV{$v} br ; } Remarque : l'administrateur du serveur HTTP peut décider des variables qui sont positionnées Les variables d'environnement Les langages de programmation CGI Tout ce qu'on veut du moment que le CGI est exécutable par le serveur HTTP le langage permet de lire les variables d'environnement et/ou l'entrée standard le langage permet d'écrire sur la sortie standard Les plus utilisés Perl : langage interprété qui est un mélange de C, sed, awk sh : se prête bien au développement de scripts CGI C : langage compilé et plus proche du système donc plus sécurisé les sources du CGI ne sont pas accessibles via le Web permet des authentifications de l'exécutant Les langages de programmation CGI Parser les données du formulaire Accès aux variables d'environnement en C : getenv( nom ) et variable environ en sh : $nom en perl : $ENV{'nom'} et variable %ENV en PHP : $_SERVER['nom'] Les entrées-sorties en C : printf( chaine ); et scanf( %s ,data); en sh : chaine et read data en perl : print chaine\n ; et read(stdin, $data, $ENV{'Content_length'}); Avantage du langage compilé exécution plus rapide dans les cas de gros calculs Objectif : récupérer dans des variables du langage utilisé les couples NOM / VALEUR associés aux champs du formulaire Perl (cgi-lib.pl) C et bien d'autres! PHP : déjà fait tableaux associatifs _POST ou _GET $_GET['nom_champ1'] $_POST['nom_champ1'] Parser les données du formulaire Configuration du serveur Apache Exemple en shell pour la méthode GET # parse.cgi 'Content-type: text/plain' DONNES_CGI=` $QUERY_STRING tr & \n ` for champ in $DONNES_CGI do nom=` $champ cut -d '=' -f 1` valeur= ` $champ cut -d '=' -f 2 tr + ` # decodage des %xx valeur_decode=` $valeur sed 's/%2f/\//g'` valeur_decode=` $valeur_decode sed nom=[$nom] valeur=[$valeur][$valeur_decode] done Il faut indiquer au serveur HTTP quelles sont les requêtes qui doivent être traitées comme des CGI passage des paramètres au programme CGI exécution du CGI récupération de la sortie standard du programme pour construire la réponse HTTP 1) La directive ScriptAlias (httpd.conf) ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/ répertoires autorisés à accueillir des scripts CGI ici, toutes les requêtes du type seront traitées comme des CGI avec exécution de /usr/local/apache/cgi-bin/* Configuration du serveur Apache 2) La directive AddHandler (httpd.conf) AddHandler cgi-script.cgi.pl signifie que les requêtes de document ayant pour extension.cgi ou.pl doivent être traitées comme des CGI il faut alors autoriser les exécutions de CGI dans les répertoires qui peuvent contenir des.cgi ou des.pl Directory /home/*/public-html/cgi-bin/ Options +ExecCGI /Directory Il ne faut pas oublier de donner les droits d'exécution sur le CGI au démon HTTP La sécurité Pour limiter les trous de sécurité limiter le nombre de personnes autorisées à créer des scripts CGI sur le serveur (httpd.conf) limiter le nombre de répertoires pouvant accueillir des scripts (httpd.conf) vérifier dans le CGI que l'exécutant est bien le démon httpd ne jamais lancer le démon httpd en tant que root éviter les CGI ayant positionné le bit setuid éviter que le code source du CGI soit accessible par le réseau et puisse ainsi être analysé pour y trouver des failles de sécurité éviter l'emploi de commandes qui lancent des sous-processus (, exec(), system()...) si possible, restreindre les accès (.htaccess) La sécurité Exemple : accès au disque dur du serveur web un formulaire demande une adresse mail CGI associé : envoie un mail à l'adresse indiquée par ... mail $champ_mail le pirate saisit dans le champ mail du formulaire /etc/passwd il faut au minimum vérifier dans le CGI que le champ mail est bien uniquement une adresse mail Attention aux CGI récupérés sur le Web Consulter The World Wide Web Security FAQ Exemple du compteur de visiteurs # Count.cgi 'Content-type: text/html' ' html header title count.cgi /title /header body ' cpt1=`cat cpt1.txt` cpt1=`expr $cpt1 + 1` $cpt1 cpt1.txt bool=` $REMOTE_ADDR grep ^ ` cpt2=`cat cpt2.txt` if [! -z $bool ] then cpt2=`expr $cpt2 + 1` $cpt2 cpt2.txt fi Vous etes le visiteur no $cpt1 br $cpt2 visiteurs du domaine univ-lyon.fr ' /body /html ' Attention aux ressources partagées Utilisation d'un champ HIDDEN Il peut y avoir plusieurs exécutions simultanées d'un même CGI On retrouve les problèmes classiques de la programmation parallèle avec section critique, verrous... # section critique1 cpt1=`cat cpt1.txt` cpt1=`expr $cpt1 + 1` $cpt1 cpt1.txt # fin section critique1 bool=` $REMOTE_ADDR grep ^ ` # section critique2 cpt2=`cat cpt2.txt` if [! -z $bool ] then cpt2=`expr $cpt2 + 1` $cpt2 cpt2.txt fi # fin section critique2 Propagation d'un identifiant, login, mot de passe... Exemple : application bancaire 1. formulaire de saisie du numéro de compte et du code confidentiel 2. le CGI authentifie le client et produit un deuxième formulaire (choix de l'opération) 3. exécution d'un autre CGI... Problème de sécurité le champ HIDDEN identifiant le client est visible dans le code HTML du deuxième formulaire il peut être facile de construire une requête HTTP en changeant l'identifiant construire des identifiants cryptés Principe Les Server Side Includes (SSI) Les SSI permettent d'intégrer des directives simples dans du code HTML qui sont interprétées à la volée par le serveur avant l'envoi de la réponse Permet de rendre un service très simple insertion de la date dans un pied de page gestion d'un compteur d'accès... Intérêts utilisation beaucoup plus simple qu'un CGI évite l'écriture d'un CGI quand seule une faible partie de la page est dynamique (pied de page, ) Inconvénients pas de récupération de données en provenance du client le serveur doit supporter les directives SSI ralentissement du serveur (parser overhead) 38 Configuration du serveur Apache Il faut indiquer au serveur HTTP quelles sont les requêtes qui doivent être traitées comme des SSI AddType text/html.shtml AddHandler server-parsed.shtml signifie que les requêtes vers des documents ayant pour extension.shtml doivent être parsées comme SSI avant d'être renvoyés au client il faut alors autoriser les exécutions des directives SSI dans les répertoires qui peuvent contenir des.shtml Directory /home/*/public-html/ Options +Includes /Directory Directives SSI Syntaxe !--#commande param1= valeur1 param2= valeur2 -- Formaté comme un commentaire HTML SSI activé sur le serveur la commande est remplacée par le résultat SSI non activé la commande reste telle quelle dans le fichier HTML Petites insertions dynamiques comme JavaScript mais côté serveur (le client n'y voit que du feu) Directives SSI Exemples Paramétrage des SSI !--#config errmsg= message sizefmt= bytes abbrev timefmt= format_date -- Affichage dynamique de variables SSI !--# var= server_name -- !--# var= date_local -- Exécution d'un programme externe avec insertion de sa sortie standard dans le document courant !--#exec cgi cmd= /bin/date -- !--#exec cmd= ls -- Insérer la date de dernière modification d'un fichier !--#flastmod file= /index.shtml -- Directives SSI Exemples Insérer la taille d'un fichier (virtual : chemin Web) !--#fsize file virtual= /index.shtml -- Insérer le contenu d'un fichier dans le document courant !--#include file virtual= /pied_page.html -- Afficher toutes les variables d'environnement du serveur !--#printenv -- Positionner une variable sur le serveur !--#set name= modif value= $last_modified -- Variables SSI et format de date Les variables CGI classiques... Variables spécifiques DOCUMENT_NAME : nom du document courant DOCUMENT_URI : URL du document courant DATE_LOCAL : date et heure locales DATE_GMT : date et heure GMT LAST_MODIFIED : date et heure de dernière modification du document courant Pour paramètrer l'affichage des dates et heures %D, %M, %H, %S, %I, %A, %Y, %m, %r... !--#config timefmt= %d %r -- : 06/23/95 09:21:13 PM Expressions conditionnelles !--#if expr= ${myvar}=toto && ${bool} -- h1 ... /h1 !--#else -- h2 ... /h2 !--#endif -- avec &&,,!, =,!=, , , =, =
Search Related
We Need Your Support
Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

Thanks to everyone for your continued support.

No, Thanks
SAVE OUR EARTH

We need your sign to support Project to invent "SMART AND CONTROLLABLE REFLECTIVE BALLOONS" to cover the Sun and Save Our Earth.

More details...

Sign Now!

We are very appreciated for your Prompt Action!

x