Perl - Programmation CGI

Qu'est-ce que CGI?

  • Une interface de passerelle commune, ou CGI, est un ensemble de normes qui définit la manière dont les informations sont échangées entre le serveur Web et un script personnalisé.

  • Les spécifications CGI sont actuellement maintenues par le NCSA et NCSA définit CGI comme suit -

  • L'interface de passerelle commune, ou CGI, est une norme permettant aux programmes de passerelle externes de s'interfacer avec des serveurs d'informations tels que des serveurs HTTP.

  • La version actuelle est CGI / 1.1 et CGI / 1.2 est en cours de développement.

Navigation sur le Web

Pour comprendre le concept de CGI, voyons ce qui se passe lorsque nous cliquons sur un hyperlien disponible sur une page Web pour parcourir une page Web ou une URL particulière.

  • Votre navigateur contacte le serveur Web à l'aide du protocole HTTP et demande l'URL, c'est-à-dire le nom de fichier de la page Web.

  • Web Server vérifiera l'URL et recherchera le nom de fichier demandé. Si le serveur Web trouve ce fichier, il renvoie le fichier au navigateur sans autre exécution, sinon envoie un message d'erreur indiquant que vous avez demandé un mauvais fichier.

  • Le navigateur Web prend la réponse du serveur Web et affiche le contenu du fichier reçu ou un message d'erreur si le fichier est introuvable.

Cependant, il est possible de configurer le serveur HTTP de telle manière que chaque fois qu'un fichier dans un certain répertoire est demandé, ce fichier ne soit pas renvoyé; au lieu de cela, il est exécuté en tant que programme, et quel que soit le résultat de ce programme, il est renvoyé pour que votre navigateur s'affiche. Cela peut être fait en utilisant une fonctionnalité spéciale disponible sur le serveur Web et elle est appeléeCommon Gateway Interfaceou CGI et de tels programmes qui sont exécutés par le serveur pour produire le résultat final, sont appelés scripts CGI. Ces programmes CGI peuvent être un script PERL, un script Shell, un programme C ou C ++, etc.

Diagramme d'architecture CGI

Prise en charge et configuration du serveur Web

Avant de poursuivre la programmation CGI, assurez-vous que votre serveur Web prend en charge la fonctionnalité CGI et qu'il est configuré pour gérer les programmes CGI. Tous les programmes CGI à exécuter par le serveur Web sont conservés dans un répertoire préconfiguré. Ce répertoire est appelé répertoire CGI et par convention, il est nommé / cgi-bin. Par convention, les fichiers Perl CGI auront une extension comme.cgi.

Premier programme CGI

Voici un lien simple qui est lié à un script CGI appelé hello.cgi . Ce fichier a été conservé dans/cgi-bin/répertoire et il a le contenu suivant. Avant d'exécuter votre programme CGI, assurez-vous que vous avez le mode de changement de fichier en utilisantchmod 755 hello.cgi Commande UNIX.

#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';

1;

Maintenant si vous cliquez hello.cgi lien puis demande va au serveur Web qui recherche hello.cgi dans le répertoire / cgi-bin, l'exécute et quel que soit le résultat généré, le serveur Web renvoie ce résultat au navigateur Web, comme suit -

Hello Word! This is my first CGI program

Ce script hello.cgi est un simple script Perl qui écrit sa sortie sur un fichier STDOUT, c'est-à-dire un écran. Il y a une caractéristique importante et supplémentaire disponible qui est la première ligne à imprimerContent-type:text/html\r\n\r\n. Cette ligne est renvoyée au navigateur et spécifie le type de contenu à afficher sur l'écran du navigateur. Maintenant, vous devez avoir compris le concept de base de CGI et vous pouvez écrire de nombreux programmes CGI compliqués en utilisant Perl. Ce script peut interagir avec tout autre système d’exercice également pour échanger des informations telles qu’une base de données, des services Web ou toute autre interface complexe.

Comprendre l'en-tête HTTP

La toute première ligne Content-type:text/html\r\n\r\nfait partie de l'en-tête HTTP, qui est envoyé au navigateur afin que le navigateur puisse comprendre le contenu entrant du côté serveur. Tout l'en-tête HTTP sera sous la forme suivante -

HTTP Field Name: Field Content

Par exemple -

Content-type:text/html\r\n\r\n

Il existe quelques autres en-têtes HTTP importants que vous utiliserez fréquemment dans votre programmation CGI.

N ° Sr. En-tête et description
1

Content-type: String

Une chaîne MIME définissant le format du contenu renvoyé. L'exemple est Content-type: text / html

2

Expires: Date String

La date à laquelle les informations deviennent invalides. Cela devrait être utilisé par le navigateur pour décider quand une page doit être actualisée. Une chaîne de date valide doit être au format 01 janvier 1998 12:00:00 GMT.

3

Location: URL String

L'URL qui doit être renvoyée à la place de l'URL demandée. Vous pouvez utiliser ce fichier pour rediriger une demande vers n'importe quel autre emplacement.

4

Last-modified: String

La date de la dernière modification du fichier.

5

Content-length: String

La longueur, en octets, des données renvoyées. Le navigateur utilise cette valeur pour rapporter le temps de téléchargement estimé d'un fichier.

6

Set-Cookie: String

Définit le cookie passé à travers la chaîne

Variables d'environnement CGI

Tout le programme CGI aura accès aux variables d'environnement suivantes. Ces variables jouent un rôle important lors de l'écriture de tout programme CGI.

N ° Sr. Noms et description des variables
1

CONTENT_TYPE

Le type de données du contenu. Utilisé lorsque le client envoie du contenu joint au serveur. Par exemple, téléchargement de fichiers, etc.

2

CONTENT_LENGTH

La longueur des informations de la requête. Il est disponible uniquement pour les demandes POST

3

HTTP_COOKIE

Renvoie les cookies définis sous la forme d'une paire clé / valeur.

4

HTTP_USER_AGENT

Le champ d'en-tête de demande User-Agent contient des informations sur l'agent utilisateur à l'origine de la demande. Son nom du navigateur Web.

5

PATH_INFO

Le chemin du script CGI.

6

QUERY_STRING

Informations encodées en URL envoyées avec la demande de méthode GET.

sept

REMOTE_ADDR

L'adresse IP de l'hôte distant effectuant la demande. Cela peut être utile pour la journalisation ou à des fins d'authentification.

8

REMOTE_HOST

Le nom complet de l'hôte qui fait la demande. Si ces informations ne sont pas disponibles, REMOTE_ADDR peut être utilisé pour obtenir l'adresse IR.

9

REQUEST_METHOD

La méthode utilisée pour faire la demande. Les méthodes les plus courantes sont GET et POST.

dix

SCRIPT_FILENAME

Le chemin complet du script CGI.

11

SCRIPT_NAME

Le nom du script CGI.

12

SERVER_NAME

Le nom d'hôte ou l'adresse IP du serveur.

13

SERVER_SOFTWARE

Le nom et la version du logiciel exécuté par le serveur.

Voici un petit programme CGI pour lister toutes les variables CGI prises en charge par votre serveur Web. Cliquez sur ce lien pour voir le résultat Get Environment

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "<font size=+1>Environment</font>\n";
foreach (sort keys %ENV) {
   print "<b>$_</b>: $ENV{$_}<br>\n";
}

1;

Créer une boîte de dialogue "Téléchargement de fichier"?

Parfois, il est souhaitable que vous souhaitiez donner une option où un utilisateur cliquera sur un lien et une boîte de dialogue "Téléchargement de fichier" apparaîtra à l'utilisateur au lieu d'afficher le contenu réel. Ceci est très simple et sera réalisé via l'en-tête HTTP.

Cet en-tête HTTP sera différent de l'en-tête mentionné dans la section précédente. Par exemple, si vous souhaitez créer unFileName fichier téléchargeable à partir d'un lien donné, sa syntaxe sera la suivante -

#!/usr/bin/perl

# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";

# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) ) {
   print("$buffer");
}

Méthodes GET et POST

Vous devez avoir rencontré de nombreuses situations où vous devez transmettre certaines informations de votre navigateur au serveur Web et, finalement, à votre programme CGI qui gère vos demandes. Le navigateur utilise le plus souvent deux méthodes pour transmettre ces informations au serveur Web. Ces méthodes sontGET Méthode et POSTMéthode. Vérifions-les un par un.

Transmission d'informations à l'aide de la méthode GET

La méthode GET envoie les informations utilisateur codées ajoutées à l'URL de la page elle-même. La page et les informations encodées sont séparées par le? caractère comme suit -

http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2

La méthode GET est la méthode par défaut pour transmettre des informations d'un navigateur au serveur Web et elle produit une longue chaîne qui apparaît dans la zone Emplacement: de votre navigateur. Vous ne devez jamais utiliser la méthode GET si vous avez un mot de passe ou d'autres informations sensibles à transmettre au serveur. La méthode GET a une limitation de taille: seuls 1024 caractères peuvent être passés dans une chaîne de requête.

Ces informations sont transmises en utilisant QUERY_STRING et sera accessible dans votre programme CGI via la variable d'environnement QUERY_STRING que vous pouvez analyser et utiliser dans votre programme CGI.

Vous pouvez transmettre des informations en concaténant simplement des paires clé et valeur avec n'importe quelle URL ou vous pouvez utiliser des balises HTML <FORM> pour transmettre des informations à l'aide de la méthode GET.

Exemple d'URL simple: méthode Get

Voici une URL simple qui transmettra deux valeurs au programme hello_get.cgi en utilisant la méthode GET.

Ci-dessous hello_get.cgi script pour gérer les entrées fournies par le navigateur Web.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET") {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name  = $FORM{last_name};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";

1;

Exemple de formulaire simple: méthode GET

Voici un exemple simple, qui transmet deux valeurs à l'aide du formulaire HTML et du bouton d'envoi. Nous allons utiliser le même script CGI hello_get.cgi pour gérer cette entrée.

<FORM action = "/cgi-bin/hello_get.cgi" method = "GET">
First Name: <input type = "text" name = "first_name">  <br>

Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>

Voici la sortie réelle du codage de formulaire ci-dessus. Vous pouvez maintenant entrer le prénom et le nom, puis cliquer sur le bouton Soumettre pour voir le résultat.

Transmission d'informations à l'aide de la méthode POST

Une méthode plus fiable pour transmettre des informations à un programme CGI est la POSTméthode. Cela regroupe les informations exactement de la même manière que les méthodes GET, mais au lieu de les envoyer sous forme de chaîne de texte après un?dans l'URL, il l'envoie en tant que message séparé dans le cadre de l'en-tête HTTP. Le serveur Web fournit ce message au script CGI sous la forme de l'entrée standard.

Ci-dessous le modifié hello_post.cgiscript pour gérer les entrées fournies par le navigateur Web. Ce script gérera GET ainsi que la méthode POST.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name  = $FORM{last_name};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";

1;

Reprenons le même exemple que ci-dessus, qui passe deux valeurs à l'aide du formulaire HTML et du bouton d'envoi. Nous allons utiliser le script CGI hello_post.cgi pour gérer cette entrée.

<FORM action = "/cgi-bin/hello_post.cgi" method = "POST">
First Name: <input type = "text" name = "first_name">  <br>

Last Name: <input type = "text" name = "last_name">

<input type = "submit" value = "Submit">
</FORM>

Voici la sortie réelle du codage du formulaire ci-dessus, vous entrez le prénom et le nom, puis cliquez sur le bouton Soumettre pour voir le résultat.

Transmission des données de case à cocher au programme CGI

Les cases à cocher sont utilisées lorsque plusieurs options doivent être sélectionnées. Voici un exemple de code HTML pour un formulaire avec deux cases à cocher.

<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on"> Maths
<input type = "checkbox" name = "physics" value = "on"> Physics
<input type = "submit" value = "Select Subject">
</form>

Le résultat de ce code est la forme suivante -

Ci-dessous checkbox.cgi script pour gérer l'entrée donnée par le navigateur Web pour le bouton radio.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
if( $FORM{maths} ) {
   $maths_flag ="ON";
} else {
   $maths_flag ="OFF";
}
if( $FORM{physics} ) {
   $physics_flag ="ON";
} else {
   $physics_flag ="OFF";
}

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Checkbox - Third CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> CheckBox Maths is : $maths_flag</h2>";
print "<h2> CheckBox Physics is : $physics_flag</h2>";
print "</body>";
print "</html>";

1;

Transmission des données de bouton radio au programme CGI

Les boutons radio sont utilisés lorsqu'une seule option doit être sélectionnée. Voici un exemple de code HTML pour un formulaire avec deux boutons radio -

<form action = "/cgi-bin/radiobutton.cgi" method = "POST" target = "_blank">
<input type = "radio" name = "subject" value = "maths"> Maths
<input type = "radio" name = "subject" value = "physics"> Physics
<input type = "submit" value = "Select Subject">
</form>

Le résultat de ce code est la forme suivante -

Ci-dessous radiobutton.cgi script pour gérer l'entrée donnée par le navigateur Web pour le bouton radio.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$subject = $FORM{subject};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Radio - Fourth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";

1;

Transmission de données de zone de texte au programme CGI

Un élément textarea est utilisé lorsqu'un texte multiligne doit être transmis au programme CGI. Voici un exemple de code HTML pour un formulaire avec une zone TEXTAREA -

<form action = "/cgi-bin/textarea.cgi" method = "POST" target = "_blank">
<textarea name = "textcontent" cols = 40 rows = 4>
Type your text here...
</textarea>
<input type = "submit" value = "Submit">
</form>

Le résultat de ce code est la forme suivante -

Ci-dessous le textarea.cgi script pour gérer les entrées fournies par le navigateur Web.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$text_content = $FORM{textcontent};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Entered Text Content is $text_content</h2>";
print "</body>";
print "</html>";

1;

Transmission de données de boîte déroulante au programme CGI

Une liste déroulante est utilisée lorsque de nombreuses options sont disponibles mais qu'une ou deux seulement seront sélectionnées. Voici un exemple de code HTML pour un formulaire avec une liste déroulante

<form action = "/cgi-bin/dropdown.cgi" method = "POST" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit">
</form>

Le résultat de ce code est la forme suivante -

Ci-dessous le dropdown.cgi script pour gérer les entrées fournies par le navigateur Web.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$subject = $FORM{dropdown};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Dropdown Box - Sixth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";

1;

Utilisation de cookies dans CGI

Le protocole HTTP est un protocole sans état. Mais pour un site Web commercial, il est nécessaire de conserver les informations de session entre différentes pages. Par exemple, l'enregistrement d'un utilisateur se termine après des transactions qui s'étendent sur plusieurs pages. Mais comment conserver les informations de session de l'utilisateur sur toutes les pages Web?

Dans de nombreuses situations, l'utilisation de cookies est la méthode la plus efficace pour se souvenir et suivre les préférences, les achats, les commissions et d'autres informations nécessaires pour une meilleure expérience des visiteurs ou des statistiques du site.

Comment ça fonctionne

Votre serveur envoie certaines données au navigateur du visiteur sous la forme d'un cookie. Le navigateur peut accepter le cookie. Si tel est le cas, il est stocké sous forme d'enregistrement en texte brut sur le disque dur du visiteur. Désormais, lorsque le visiteur arrive sur une autre page de votre site, le cookie est disponible pour la récupération. Une fois récupéré, votre serveur sait / se souvient de ce qui a été stocké.

Les cookies sont un enregistrement de données en texte brut de 5 champs de longueur variable -

  • Expires- La date d'expiration du cookie. Si ce champ est vide, le cookie expirera lorsque le visiteur quittera le navigateur.

  • Domain - Le nom de domaine de votre site.

  • Path- Le chemin d'accès au répertoire ou à la page Web qui a défini le cookie. Cela peut être vide si vous souhaitez récupérer le cookie à partir de n'importe quel répertoire ou page.

  • Secure- Si ce champ contient le mot «sécurisé», le cookie ne peut être récupéré que sur un serveur sécurisé. Si ce champ est vide, une telle restriction n'existe pas.

  • Name = Value - Les cookies sont définis et revus sous la forme de paires clé et valeur.

Configurer les cookies

Il est très facile d'envoyer des cookies au navigateur. Ces cookies seront envoyés avec l'en-tête HTTP. En supposant que vous souhaitiez définir l'ID utilisateur et le mot de passe en tant que cookies. Donc, ce sera fait comme suit -

#!/usr/bin/perl

print "Set-Cookie:UserID = XYZ;\n";
print "Set-Cookie:Password = XYZ123;\n";
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT";\n";
print "Set-Cookie:Domain = www.tutorialspoint.com;\n";
print "Set-Cookie:Path = /perl;\n";
print "Content-type:text/html\r\n\r\n";
...........Rest of the HTML Content goes here....

Ici nous avons utilisé Set-CookieEn-tête HTTP pour définir les cookies. Il est facultatif de définir des attributs de cookies tels que Expire, Domain et Path. Il est important de noter que les cookies sont définis avant l'envoi de la ligne magique"Content-type:text/html\r\n\r\n.

Récupération des cookies

Il est très facile de récupérer tous les cookies définis. Les cookies sont stockés dans la variable d'environnement CGI HTTP_COOKIE et ils auront la forme suivante.

key1 = value1;key2 = value2;key3 = value3....

Voici un exemple de récupération des cookies.

#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'};
@cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ) {
   ($key, $val) = split(/=/, $cookie); # splits on the first =.
   $key =~ s/^\s+//;
   $val =~ s/^\s+//;
   $key =~ s/\s+$//;
   $val =~ s/\s+$//;
   if( $key eq "UserID" ) {
      $user_id = $val;
   } elsif($key eq "Password") {
      $password = $val;
   }
}
print "User ID  = $user_id\n";
print "Password = $password\n";

Cela produira le résultat suivant, à condition que les cookies ci-dessus aient été définis avant d'appeler le script de cookies de récupération.

User ID = XYZ
Password = XYZ123

Modules et bibliothèques CGI

Vous trouverez de nombreux modules intégrés sur Internet qui vous fournissent des fonctions directes à utiliser dans votre programme CGI. Voici les moments importants.