Perl - Programmazione CGI

Cos'è la CGI?

  • Una Common Gateway Interface, o CGI, è un insieme di standard che definisce 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 disponibile su una pagina web per sfogliare una particolare pagina web o URL.

  • Il browser contatta il server Web utilizzando il protocollo HTTP e richiede l'URL, ovvero il nome del file della pagina Web.

  • Web Server controllerà l'URL e cercherà il nome del file richiesto. Se il server web trova quel file, invia il file al browser senza alcuna ulteriore esecuzione, 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 contenuto del file ricevuto o un messaggio di errore nel caso in cui il file non venga trovato.

Tuttavia, è possibile impostare il server HTTP in modo tale che ogni volta che viene richiesto un file in una determinata directory, quel file non viene restituito; invece viene eseguito come un programma, e qualunque cosa quel programma emetta come risultato, viene rimandata indietro per la visualizzazione del browser. Questo può essere fatto utilizzando una funzionalità speciale disponibile nel server web e si chiamaCommon Gateway Interfaceo CGI e tali programmi che vengono eseguiti dal server per produrre il risultato finale, 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 la funzionalità CGI e che sia configurato per gestire i programmi CGI. Tutti i programmi CGI che devono essere eseguiti dal web server sono conservati in una directory preconfigurata. Questa directory è chiamata directory CGI e per convenzione è chiamata / cgi-bin. Per convenzione i file CGI Perl avranno estensione come.cgi.

Primo programma CGI

Ecco un semplice collegamento che è collegato a uno script CGI chiamato hello.cgi . Questo file è stato conservato in/cgi-bin/directory e ha il seguente contenuto. Prima di eseguire il programma CGI, assicurati di aver modificato la modalità di utilizzo del filechmod 755 hello.cgi Comando 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;

Ora se fai clic su hello.cgi il collegamento quindi la richiesta va al server web che cerca hello.cgi nella directory / cgi-bin, lo esegue e qualunque sia il risultato generato, il server web invia quel risultato al browser web, che è il seguente:

Hello Word! This is my first CGI program

Questo script hello.cgi è un semplice script Perl che scrive il suo output sul file STDOUT, cioè screen. C'è una caratteristica importante ed extra disponibile che è la prima riga da stampareContent-type:text/html\r\n\r\n. Questa riga viene rinviata al browser e specifica il tipo di contenuto da visualizzare nella schermata del browser. Ora devi aver compreso il concetto di base di CGI e puoi scrivere molti programmi CGI complicati usando Perl. Questo script può interagire con qualsiasi altro sistema fisico anche per scambiare informazioni come database, servizi web o qualsiasi altra interfaccia complessa.

Comprensione dell'intestazione HTTP

La prima riga Content-type:text/html\r\n\r\nè una parte dell'intestazione HTTP, che viene inviata al browser in modo che il browser possa comprendere il contenuto in arrivo dal lato server. Tutta l'intestazione HTTP avrà la seguente forma:

HTTP Field Name: Field Content

Ad esempio -

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

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

Sr.No. Intestazione e descrizione
1

Content-type: String

Una stringa MIME che definisce il formato del contenuto 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 altra posizione.

4

Last-modified: String

La data dell'ultima modifica del file.

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.

Sr.No. Nomi e descrizione delle variabili
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.

Ecco un piccolo programma CGI per elencare tutte le variabili CGI supportate dal tuo server web. Fare clic su questo collegamento per visualizzare il risultato Ottieni ambiente

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

Sollevare una finestra di dialogo "Download file"?

A volte si desidera dare un'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 fileFileName file scaricabile da un determinato collegamento, 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 che gestisce le tue richieste. Il più delle volte il browser utilizza due metodi per passare queste informazioni al server web. Questi metodi sonoGET Metodo e POSTMetodo. Controlliamoli uno per uno.

Passaggio di informazioni utilizzando il metodo GET

Il metodo GET invia le informazioni utente codificate aggiunte all'URL della pagina stessa. 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 da un 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 sensibili da passare al server. Il metodo GET ha un limite di dimensione: solo 1024 caratteri possono essere passati in una stringa di richiesta.

Queste informazioni vengono passate utilizzando QUERY_STRING intestazione e sarà accessibile nel tuo programma CGI tramite la variabile d'ambiente QUERY_STRING che puoi analizzare e utilizzare nel tuo programma CGI.

Puoi passare le informazioni semplicemente concatenando coppie di chiavi e valori insieme a qualsiasi URL oppure puoi 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.

http://www.tutorialspoint.com/cgi-bin/hello_get.cgi?first_name=ZARA&last_name=ALI

Sotto è hello_get.cgi script 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;

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 della codifica del modulo sopra. Ora puoi inserire Nome e Cognome e quindi fare clic sul pulsante Invia per vedere il risultato.

Passaggio di informazioni utilizzando il metodo POST

Un metodo più affidabile per passare informazioni a un programma CGI è il POSTmetodo. Questo impacchetta le informazioni esattamente allo stesso modo dei metodi GET, ma invece di inviarle come stringa di testo dopo un file?nell'URL, lo invia come messaggio separato come parte dell'intestazione HTTP. Il server Web fornisce questo messaggio allo script CGI sotto forma di input standard.

Di seguito è il modificato hello_post.cgiscript 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 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 della codifica del modulo sopra, inserisci Nome e Cognome e quindi fai clic sul pulsante Invia per vedere il risultato.

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 è il seguente modulo:

Sotto è checkbox.cgi script 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:

Sotto è radiobutton.cgi script 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

Un elemento textarea viene utilizzato quando il testo multilinea deve essere passato 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 il file textarea.cgi script 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

Una 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 il file dropdown.cgi script 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 transazioni che si estendono su 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 goes here....

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

Recupero dei cookie

È molto facile 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";

Ciò produrrà il seguente risultato, a condizione che i cookie sopra siano stati impostati prima di chiamare lo script di recupero dei cookie.

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.