Techniques de Programmation pour Internet

Année Spéciale Informatique

ENSIMAG 2002 - 2003

James L. Crowley

Séance 6

Annullé

Decodage des Parametres

TEST

Plan :

HTTP : Hyper Text Transfert Protocole

Debut du page

Modèle client-serveur pour le transfert des documents hypertextes.

Protocole utilisé par les serveurs WWW depuis 1990.

Échange de messages codés dans un format similaire au type MIME.

URL = Uniform Ressource Locator

method://[User [ : Password ] @]machine[:port]/fichier[#ancre|?params]

URI Syntaxe


 	"%"	(Percent)	Caractere d'Escape
	"/"	(Slash) - Indicateur de Hiérarchie. 
	"#"	(Hash) - Identificateur de Fragment (ex les anchors). 
	"?" 	(Query) - Delimiteur de interrogation. 
	"+"  	utilisé pour les espace. 

Parametres : ?name1=value1&name2=value2

Codage des Paramètres

Debut du page

1. Les caractères non ASCII (code > 128) sont remplacés par %xx ou xx est le code ASCII.

2. Les caractères réservés sont remplacés par leur code ASCII. Ils sont :

< > " # % ! $ \ & ( ) + = } [ ] \ : ; ~ ? , / [TAB]

3. L'espace est remplacé par le signe +

4. Les pairs noms/valeur sont transformés par la chaîne de caractères : nom=valeur

5. Les différentes chaînes de caractères sont contaminées en insérant le symbole & entre les paires : nom1=valeur1&nom2=valeur2&...

Il y a deux méthodes de passage des paramètres aux scripts :

Décodage des Paramètres

Debut du page

Dans une scripte, on peut construire une "hash" des paramètres avec le code suivant.


#Determine le type de passage 
$method = $ENV{'REQUEST_METHOD'};
if ($method eq "GET")
{
    $query = $ENV{'QUERY_STRING'};
}
 elsif  ($method eq "POST")
{   
    $size = $ENV{'CONTENT_LENGTH'};
    read (STDIN, $query, $size);
} else
{
    &return_error(500, 
                "Server Error", "Unsupported Method");
}

#split le query en key=value. 
@key_value_pairs = split(/&/, $query);

#decode chaque parametre
foreach $key_value (@key_value_pairs)
{
    ($key, $value) = split(/=/, $key_value);
    $value =~ tr/+/ /;
    $value =~ 
                s/%([\dA-Fa-f][\dA-Fa-f])/pack("C", hex($1))/eg;
    $data{$key} = $value;
    print "data($key) = $data{$key}", "\n"; 
}

Le hash %data contiennent les valeurs des paramètres indexés par les clés.

Analyse des Données en PERL

Debut du page

PERL contient trois opérateurs puissants pour l'analyse de données textuelles :

Ces expressions sont rendu puissante, mais illisible, par l'existence des caractères spéciales :

[, ], (, ), *, ., ^, -, |, \, ?

Match

Debut du page

Syntaxe :

Trouver l'existence de la chaÓne "motif" dans la chaÓne de caractères $chaÓne

Exemples : Seance6/s6.1.html - Détecter le Navigateur employé.


#!/usr/local/bin/perl
# script Seance6/s6.1.cgi
print "Content-type: text/html\n\n";

#$browser = $ENV{'HTTP_USER_AGENT'};
$browser = "Mozilla";

if ($browser =~ m/Mozilla/)
{
   print "I see you are using Netscape.  Good Choice\n"; 
}  else 
{
    print "I recommend that you switch to Netscape\n";
}

Match est sensible au minuscules-majuscule. Pour rendre la recherche insensible au majuscule, utilise l'option "i".

Exemple :

if ($query = ~m/help/i) { print "Voulez-vous de l\'aide?", "\n" }; 

Substitute

Debut du page

Syntaxe : $chaine =~ s/veiux/nouveau/g; La commande "s" permettre de remplacer la première instance d'un motif par un autre.

Avec l'option "g", cette commande remplace TOUS les instances.

Exemple. Le script y2k.cgi prepare pour l'année 2000 en remplacent chaque "y" par un "k". Seance6/s6.2.html

#!/usr/local/bin/perl
#file Seance6/s6.2.cgi
print "Content-type: text/html", "\n\n";
print "<HTML>" , "\n";
print "<TITLE>Preparation pour Y2K</TITLE>" , "\n";
print "<BODY>" , "\n";
$query = $ENV{'QUERY_STRING'};

($field, $value) = split(/=/, $query);
$value =~ tr/+/ /;

print qq(Votre donnee est : "$value".), "\n";

$value =~ s/y/k/gi; 

print qq(Pour l'année 2000 il faut : "$value".), "\n";

print " <br>", "\n";
print "</BODY>" , "\n";
print "/HTML>" , "\n";
exit(0); 

Inspection du résultat de Match et Substitute

Debut du page

PERL affecte trois variables avec le résultat de Match et Substitut :

$& contient le motif qui etait matchaient.

$` contient le chaine avant le match. $' contient le reste de la chaîne.

Exemple : Seance6/s6.3.html

$query = "string=Please+HELP+me!";

($field, $value) = split(/=/, $query);
$value =~ tr/+/ /;

print "field = $field.
value=  $value. 
", "\n";

$value =~ m/help/i; 

print qq(Avant le mot help il y a "$`"), "\n";
print qq(Le mot help : "$&"), "\n";
print qq(Apres le mot help il y a "$'"), "\n";

Decoupage avec Split Syntaxe :

Debut du page
        @resultat = split(/motif/,$donnee);

Le résultat est de type array!

Exemple classique :

        ($field, $value) = split(/=/, $query);

Par exemple. la commande suivante découpe une chaîne en mots. Seance6/s6.4.html

Chaque mot est une chaÓne dans une array.

@mots = split(/ /, $query);

On peut ensuite découper chaque mot en lettre

foreach $mot (@mots)
{
   print qq(Pour le mot "$mot" les lettres sont : );
   @lettres = split(/./, $mot);
}

Construction de Motifs de recherche.

Debut du page

Les caractères spéciales sont

Le Joker Dans les motifs pour "match", "substitute" et "split", le caractère "." est un joker.

Il match tout ou rien.

Exemple, /p.p/ select les pap, pop, p%p, pp, etc.

Escape

Pour inclure un caractère spécial dans un motif, il faut le précéder par \. exemple : Pour matcher un "." lui-même, il faut précéder avec "\"

$query = "3.14159";
($decimal, $fraction) = split (/\./, $query);
print "Decimal : $decimal,  Fraction = $fraction\n";

D'autre caractère spéciales sont

Match avec un groupe de caractères.

Les caractères "[" et "]" permettent de définir une range.

Exemples :

Exemple :

if ($query =~ m/[0-9]/) {print "numero $& detecte\n";}

Detection d'une exception

Noter une teste pour une exception avec "^".

exemple :

if ($query =~ m/[^0-9]/) {print "non-numéro $& detecté\n";} 

Les raccourcisses des classes. on peut utiliser

Suivre le symbole par {m, n} a fin de spécifier un minimum de "m" et un maximum de "n".

Si on note que {m}, la valeur de "n" est par defaut, à l'infini.

Exemple : \d{5} permet de rechercher au mois 5 entières.

if ($query =~ m/\d{5}/) {print qq(5 numeros "$&" detecte'\n);}

Quantification

Le "+" permet les correspondences multiples (minimum 1).

if ($query =~ m/1+/g) {print "numero $& detecte avant $'\n";}

Disjonction

Les alternatives peuvent être listé avec "|" exemple :

Pour reconnaître les numéros en style français ou américain on utilise \.|\,

$query = "3,14159";
($decimal, $fraction) = split (/\.|\,/, $query);
print "Decimal = $decimal,  Fraction = $fraction\n";

Parentheses

Tout qui est matché dans les parenthèses est stocké dans une variable nommée $n ou "n" est un numéro.
Par exemple :
 m/(\d)/;  affecte le résultat à $1. 
exemple :
$query = "3.14159";
if ($query =~ m/(\d)\.(\d+)/)
{ print '$1 = ', $1, ' $2 = ', $2;}
résultat :
$1 = 3 $2 = 14159

Scripte PERL de Decodage

Debut du page

Dans notre scripte, nous avons décodés les paramètres avec :

$value =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C", hex($1))/eg;

Les Valeurs Cachées (Hidden fields)

Dans la construction d'un page, on peut avoir besoins de stocker l'information acquis d'une forme précédente.

Par exemple, on peut avoir besoin de conserver une hash %data.

Ors, CGI est une protocole sans mémoire.

Que faire? Il faut utiliser les valeurs cachées.

Utilisez la commande (HTML) INPUT avec type HIDDEN.

Le résultat name=value apparaître dans les paramètres d'une appelle.

Par exemple, la scripte suivante encode un "hash" dans une page html sous forme de valeurs cachées.

foreach $key (keys %data)
{
print qq(<INPUT TYPE=HIDDEN NAME="$key" VALUE="$data{$key}">);

}

Seance6/s6.5.html the demo.

Cookies

Debut du page

Cookies permet d'identifier un utilisateur.

Un scripte CGI peut envoyer un "cookie" avec une identification unique à une utilisateur.

Le scripte peut consulter les cookies d'un utilisateur afin d'adapter les réponses aux commandes.

Les cookies sont lus par une scripte CGI avec les variables de l'environnement.

Les cookies sont stockés par un script CGI par la commande html : Set-Cookie

Envois des Cookies

Debut du page

La commande html Set-Cookie doit etre exécuté AVANT la commande Content-Type.

En PERL, on écrit : print "Set-Cookie:$name=$value\n"; La taille maximum de "value" est de 4K octet.

la valeur du cookie est déterminé par le scripte

Par exemple, soit qu'un utilisateur a choisi la francaise comme langue.

Dans une $query, nous avons : ......&language=Francaise&....

Dans votre hash %data vous trouvez : "Francaise" pour $dataÊ{"language"};

Vous pouvez stocker ceci dans le navigateur de l'utilisateur avec :


print "Set-Cookie:language=$data{"language"}\n";
print FILE "Content-type: text/html", "\n\n";
print FILE "" , "\n";
...
print FILE "" , "\n";

Le cookie est stocké temporairement, il est effacé par le navigateur quand l'utilisateur termine son execution du navigateur.

Vous pouvez forcer le stockage de la cookie par l'affection d'une date d'expiration en format jjj,dd-mmm-yyyy hh:mm:ss GMT.

Ceci peut géner certaine utilisateurs. Par exemple :


print "Set-Cookie:language=$data{"language"}; 
        expires=Thu, 23-Mar-2000  00:00:00 GMT\n";

Lecture des Cookie

Si le navigateur contient les cookies avec le nom de votre domaine,

ils sont transmis dans une requète et stocké dans une variable de l'environnement HTTP_COOKIE

La scripte suivant construit un hash avec les cookies.


if ($ENV{'HTTP_COOKIE'})
{
        @cookies = split(/;/, $ENV{'HTTP_COOKIE'});
        foreach $cookie (@cookies)
        {
                ($name, $value) = split(/=/, $cookie);
                $cookie-hash($name) = $value;
        }
)

Voici un exemple Run Seance6/s6.7.html the demo.