Tutorial PERL e CGI

Cos'è la CGI?

Common Gateway Interface, o CGI, è un insieme di standard che definiscono il modo in cui le informazioni vengono scambiate tra il server Web e uno script personalizzato.

Le specifiche CGI sono attualmente mantenute dall'NCSA e NCSA definisce CGI come segue:

Common Gateway Interface, o CGI, è uno standard per i programmi gateway esterni per interfacciarsi con i server di informazioni come i server HTTP.

La versione corrente è CGI / 1.1 e CGI / 1.2 è in fase di elaborazione.

Navigare su Internet

Per comprendere il concetto di CGI, vediamo cosa succede quando facciamo clic su un collegamento ipertestuale per esplorare una particolare pagina web o URL.

  • Il browser contatta il server Web HTTP e richiede l'URL, ad es. nome del file.

  • Il Web Server analizzerà l'URL e cercherà il nome del file se trova quel file, quindi lo rimanda al browser altrimenti invia un messaggio di errore che indica che hai richiesto un file sbagliato.

  • Il browser Web riceve la risposta dal server Web e visualizza il file ricevuto o il messaggio di errore.

Tuttavia, è possibile impostare il server HTTP in modo che ogni volta che viene richiesto un file in una determinata directory, quel file non viene restituito; invece viene eseguito come un programma e tutto ciò che il programma emette viene rispedito al browser per la visualizzazione. Questa funzione è chiamata Common Gateway Interface o CGI ei programmi sono chiamati script CGI. Questi programmi CGI possono essere uno script PERL, uno script shell, un programma C o C ++ ecc.

Diagramma di architettura CGI

Supporto e configurazione del server Web

Prima di procedere con la programmazione CGI, assicurati che il tuo server Web supporti CGI e che sia configurato per gestire i programmi CGI. Tutti i programmi CGI che possono essere eseguiti dal server HTTP sono conservati in una directory preconfigurata. Questa directory è chiamata CGI Directory e per convenzione è chiamata / cgi-bin. Per convenzione i file CGI PERL avranno estensione come.cgi.

Primo programma CGI

#!/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;

Produzione

Hello Word! This is my first CGI program

Intestazione HTTP

La linea Content-type:text/html\r\n\r\nfa parte dell'intestazione HTTP che viene inviata al browser per comprendere il contenuto. Tutta l'intestazione HTTP sarà nella seguente forma

HTTP Field Name: Field Content

Per esempio

Tipo di contenuto: testo / html \ r \ n \ r \ n

Ci sono poche altre importanti intestazioni HTTP che userete frequentemente nella vostra programmazione CGI.

S.No. Intestazione e descrizione
1

Content-type: String

Una stringa MIME che definisce il formato del file restituito. L'esempio è Content-type: text / html

2

Expires: Date String

La data in cui le informazioni diventano non valide. Questo dovrebbe essere utilizzato dal browser per decidere quando una pagina deve essere aggiornata. Una stringa di data valida deve essere nel formato 01 gen 1998 12:00:00 GMT.

3

Location: URL String

L'URL che dovrebbe essere restituito al posto dell'URL richiesto. È possibile utilizzare questo file per reindirizzare una richiesta a qualsiasi file.

4

Last-modified: String

La data dell'ultima modifica della risorsa.

5

Content-length: String

La lunghezza, in byte, dei dati restituiti. Il browser utilizza questo valore per segnalare il tempo di download stimato per un file.

6

Set-Cookie: String

Imposta il cookie passato attraverso la stringa

Variabili d'ambiente CGI

Tutto il programma CGI avrà accesso alle seguenti variabili d'ambiente. Queste variabili svolgono un ruolo importante durante la scrittura di qualsiasi programma CGI.

S.No. Nome e descrizione della variabile
1

CONTENT_TYPE

Il tipo di dati del contenuto. Utilizzato quando il client invia il contenuto allegato al server. Ad esempio caricamento di file ecc.

2

CONTENT_LENGTH

La lunghezza delle informazioni sulla query. È disponibile solo per le richieste POST.

3

HTTP_COOKIE

Restituisce i cookie impostati sotto forma di coppia chiave e valore.

4

HTTP_USER_AGENT

Il campo dell'intestazione della richiesta dell'agente utente contiene informazioni sull'agente utente che ha originato la richiesta. Il suo nome del browser web.

5

PATH_INFO

Il percorso per lo script CGI.

6

QUERY_STRING

Le informazioni con codifica URL inviate con la richiesta del metodo GET.

7

REMOTE_ADDR

L'indirizzo IP dell'host remoto che effettua la richiesta. Questo può essere utile per la registrazione o per scopi di autenticazione.

8

REMOTE_HOST

Il nome completo dell'host che effettua la richiesta. Se queste informazioni non sono disponibili, è possibile utilizzare REMOTE_ADDR per ottenere l'indirizzo IR.

9

REQUEST_METHOD

Il metodo utilizzato per effettuare la richiesta. I metodi più comuni sono GET e POST.

10

SCRIPT_FILENAME

Il percorso completo dello script CGI.

11

SCRIPT_NAME

Il nome dello script CGI.

12

SERVER_NAME

Il nome host o l'indirizzo IP del server.

13

SERVER_SOFTWARE

Il nome e la versione del software in esecuzione sul server.

#!/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;

Produzione

Environment CONTEXT_DOCUMENT_ROOT: 
CONTEXT_PREFIX: 
DOCUMENT_ROOT: 
GATEWAY_INTERFACE: 
GEOIP_ADDR: 
GEOIP_CONTINENT_CODE: 
GEOIP_COUNTRY_CODE: 
GEOIP_COUNTRY_NAME: 
HTTP_ACCEPT: 
HTTP_ACCEPT_ENCODING: 
HTTP_ACCEPT_LANGUAGE: 
HTTP_COOKIE: 
HTTP_HOST: 
HTTP_UPGRADE_INSECURE_REQUESTS: 
HTTP_USER_AGENT: 
HTTP_VIA: 
HTTP_X_FORWARDED_FOR: 
HTTP_X_FORWARDED_PROTO: 
HTTP_X_HOST: 
PATH: 
QUERY_STRING: 
REMOTE_ADDR: 
REMOTE_PORT: 
REQUEST_METHOD: 
REQUEST_SCHEME: 
REQUEST_URI: 
SCRIPT_FILENAME: 
SCRIPT_NAME: 
SCRIPT_URI: 
SCRIPT_URL: 
SERVER_ADDR: 
SERVER_ADMIN: 
SERVER_NAME: 
SERVER_PORT: 
SERVER_PROTOCOL: 
SERVER_SIGNATURE: 
SERVER_SOFTWARE: 
UNIQUE_ID:

Come aprire una finestra di dialogo "Download file"?

A volte si desidera dare l'opzione in cui un utente farà clic su un collegamento e verrà visualizzata una finestra di dialogo "Download file" per l'utente invece di visualizzare il contenuto effettivo. Questo è molto semplice e verrà ottenuto tramite l'intestazione HTTP.

Questa intestazione HTTP sarà diversa dall'intestazione menzionata nella sezione precedente.

Ad esempio, se vuoi creare un file FileName file scaricabile da un dato collegamento quindi la sua sintassi sarà la seguente.

#!/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");
}

Metodi GET e POST

Devi esserti imbattuto in molte situazioni in cui hai bisogno di passare alcune informazioni dal tuo browser al server web e, infine, al tuo programma CGI. La maggior parte delle volte il browser utilizza due metodi due trasmettono queste informazioni al server web. Questi metodi sono il metodo GET e il metodo POST.

Passaggio di informazioni utilizzando il metodo GET

Il metodo GET invia le informazioni utente codificate aggiunte alla richiesta della pagina. La pagina e le informazioni codificate sono separate dal? carattere come segue - http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2

Il metodo GET è il metodo predefinito per passare le informazioni dal browser al server web e produce una lunga stringa che appare nella casella Posizione: del browser. Non utilizzare mai il metodo GET se si dispone di password o altre informazioni riservate da passare al server. Il metodo GET ha limiti di dimensione: solo 1024 caratteri possono essere in una stringa di richiesta.

Queste informazioni vengono trasmesse utilizzando l'intestazione QUERY_STRING e saranno accessibili nel programma CGI tramite la variabile d'ambiente QUERY_STRING.

È possibile passare le informazioni semplicemente concatenando coppie di chiavi e valori insieme a qualsiasi URL oppure è possibile utilizzare i tag HTML <FORM> per passare le informazioni utilizzando il metodo GET.

Esempio di URL semplice: metodo Get

Ecco un semplice URL che passerà due valori al programma hello_get.cgi utilizzando il metodo GET.

Di seguito è riportato lo script hello_get.cgi per gestire l'input fornito dal browser 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;

Produzione

Hello ZARA ALI .....

Esempio di FORM semplice: metodo GET

Ecco un semplice esempio che trasmette due valori utilizzando HTML FORM e il pulsante di invio. Useremo lo stesso script CGI hello_get.cgi per gestire questo input.

<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>

Ecco l'output effettivo del modulo sopra, inserisci Nome e Cognome e quindi fai clic sul pulsante Invia per vedere il risultato.

First Name:

Last Name:

Passaggio di informazioni utilizzando il metodo POST

Un metodo generalmente più affidabile per passare informazioni a un programma CGI è il metodo POST. Questo impacchetta le informazioni esattamente allo stesso modo dei metodi GET, ma invece di inviarle come stringa di testo dopo un? nell'URL lo invia come messaggio separato. Questo messaggio arriva nello script CGI sotto forma di input standard.

Di seguito è riportato lo script hello_post.cgi per gestire l'input fornito dal browser web. Questo script gestirà il metodo GET e il metodo 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;

Riprendiamo lo stesso esempio di cui sopra, che trasmette due valori utilizzando il FORM HTML e il pulsante di invio. Useremo lo script CGI hello_post.cgi per gestire questo input.

<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>

Ecco l'output effettivo del modulo sopra, inserisci Nome e Cognome e quindi fai clic sul pulsante Invia per vedere il risultato.

First Name:

Last Name:

Passaggio dei dati della casella di controllo al programma CGI

Le caselle di controllo vengono utilizzate quando è necessario selezionare più di un'opzione.

Ecco un esempio di codice HTML per un modulo con due caselle di controllo

<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>

Il risultato di questo codice è la seguente forma

Maths Physics

Di seguito è riportato lo script checkbox.cgi per gestire l'input fornito dal browser Web per il pulsante di opzione.

#!/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;

Passaggio dei dati del pulsante di opzione al programma CGI

I pulsanti di opzione vengono utilizzati quando è necessario selezionare una sola opzione.

Ecco un esempio di codice HTML per un modulo con due pulsanti di opzione:

<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>

Il risultato di questo codice è il seguente modulo:

Maths Physics

Di seguito è riportato lo script radiobutton.cgi per gestire l'input fornito dal browser Web per il pulsante di opzione.

#!/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;

Passaggio dei dati dell'area di testo al programma CGI

L'elemento TEXTAREA viene utilizzato quando è necessario passare del testo su più righe al programma CGI.

Ecco un esempio di codice HTML per un modulo con una casella 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>

Il risultato di questo codice è il seguente modulo:

Di seguito è riportato lo script textarea.cgi per gestire l'input fornito dal browser 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;

Passaggio dei dati della casella a discesa al programma CGI

La casella a discesa viene utilizzata quando abbiamo molte opzioni disponibili ma ne verranno selezionate solo una o due.

Ecco un esempio di codice HTML per un modulo con una casella a discesa

<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>

Il risultato di questo codice è il seguente modulo:

Di seguito è riportato lo script dropdown.cgi per gestire l'input fornito dal browser 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;

Utilizzo dei cookie in CGI

Il protocollo HTTP è un protocollo senza stato. Ma per un sito web commerciale è necessario mantenere le informazioni sulla sessione tra le diverse pagine. Ad esempio, la registrazione di un utente termina dopo aver completato molte pagine. Ma come mantenere le informazioni sulla sessione dell'utente in tutte le pagine web.

In molte situazioni, l'utilizzo dei cookie è il metodo più efficiente per ricordare e tracciare preferenze, acquisti, commissioni e altre informazioni necessarie per una migliore esperienza dei visitatori o statistiche del sito.

Come funziona

Il tuo server invia alcuni dati al browser del visitatore sotto forma di cookie. Il browser può accettare il cookie. In caso affermativo, viene memorizzato come record di testo normale sul disco rigido del visitatore. Ora, quando il visitatore arriva a un'altra pagina del tuo sito, il cookie è disponibile per il recupero. Una volta recuperato, il tuo server sa / ricorda cosa è stato memorizzato.

I cookie sono un record di dati di testo semplice di 5 campi di lunghezza variabile -

  • Expires- La data in cui scadrà il cookie. Se questo è vuoto, il cookie scadrà quando il visitatore chiude il browser.

  • Domain - Il nome di dominio del tuo sito.

  • Path- Il percorso della directory o della pagina web che ha impostato il cookie. Questo può essere vuoto se desideri recuperare il cookie da qualsiasi directory o pagina.

  • Secure- Se questo campo contiene la parola "secure", il cookie può essere recuperato solo con un server sicuro. Se questo campo è vuoto, non esiste alcuna restrizione di questo tipo.

  • Name=Value - I cookie vengono impostati e riesaminati sotto forma di coppie chiave e valore.

Impostazione dei cookie

È molto semplice inviare cookie al browser. Questi cookie verranno inviati insieme all'intestazione HTTP. Supponendo che si desideri impostare UserID e Password come cookie. Quindi sarà fatto come segue:

#!/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....

Da questo esempio devi aver capito come impostare i cookie. Noi usiamoSet-Cookie Intestazione HTTP per impostare i cookie.

Qui è facoltativo impostare gli attributi dei cookie come Expires, Domain e Path. È da notare che i cookie vengono impostati prima dell'invio di magic line"Content-type:text/html\r\n\r\n.

Recupero dei cookie

Questo è molto facile per recuperare tutti i cookie impostati. I cookie sono memorizzati nella variabile d'ambiente CGI HTTP_COOKIE e avranno la seguente forma.

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

Ecco un esempio di come recuperare i cookie.

#!/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";

This will produce following result
User ID = XYZ
Password = XYZ123

Moduli e librerie CGI

Troverai molti moduli incorporati su Internet che ti forniscono funzioni dirette da usare nel tuo programma CGI. Di seguito sono gli importanti una volta.