Latest web development tutorials

Perl CGI Programming

Qual è CGI

CGI attualmente mantenuto da NCSA, NCSA CGI è definito come segue:

CGI (Common Gateway Interface), Common Gateway Interface, che è un programma in esecuzione sul server, come ad esempio: server HTTP, l'interfaccia client fornendo la stessa pagina HTML.


navigazione Web

Per capire meglio come funziona la CGI, siamo in grado di cliccare su un link in una pagina web o un URL del processo:

  • 1, utilizzare il browser per accedere all'URL e connettersi al server Web HTTP.
  • 2, il server Web riceve il messaggio di richiesta sarà analizzata URL e guardare file acceduti sul server se c'è, se c'è da restituire il contenuto del file, altrimenti restituisce un messaggio di errore.
  • 3, il browser riceve le informazioni dal server e visualizza i messaggi di file o di errore ricevuti.

programmi CGI possono essere uno script Python, script in Perl, shell script, programmi C o C ++.


Grafico CGI

cgiarch


configurazione del server Web e il supporto

Prima di effettuare la programmazione CGI, fare in modo che il server Web è stato configurato per supportare CGI e gestore CGI.

Apache supporta la configurazione CGI:

Impostare la directory CGI:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

Tutti i server HTTP per eseguire programmi CGI vengono memorizzati in una directory pre-configurato. Questa directory è chiamata la directory CGI, e per convenzione, prende il nome / var / www / directory cgi-bin.

file di CGI estensione .cgi, Perl può anche usare l'estensione .pl.

Per impostazione predefinita, la configurazione del server Linux in esecuzione directory cgi-bin è / var / www.

Se si desidera specificare una directory diversa per eseguire script CGI, è possibile modificare il file di configurazione httpd.conf come segue:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options +ExecCGI
   Order allow,deny
   Allow from all
</Directory>

Aggiungere il suffisso .pl AddHandler, in modo che possiamo accedere alla fine del file di script Perl .pl:

AddHandler cgi-script .cgi .pl .py

Il primo programma CGI

Qui di seguito si crea un file test.cgi, il codice è il seguente:

#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! </h2>';
print '<p>来自本教程第一个 CGI 程序。</p>';
print '</body>';
print '</html>';

1;

Quindi aprire il browser su http: //localhost/cgi-bin/test.cgi, risultati di output sono i seguenti:

L'uscita della prima riga dello script "Content-Type: text / html \ r \ n \ r \ n" viene inviato al browser e dire al browser per visualizzare il tipo di contenuto "text / html".


HTTP

il contenuto dei file test.cgi in: parte dell'intestazione HTTP è "Content-Type text / html", verrà inviato al tipo di contenuto del browser racconta le file del browser.

formato di intestazione HTTP è il seguente:

HTTP 字段名: 字段内容

Ad esempio:

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

La seguente tabella descrive le informazioni contenute nei programmi CGI di intestazione HTTP sono spesso utilizzati:

testa descrizione
Content-type: MIME entità corrispondente alla richiesta di informazioni. Per esempio: Content-Type: text / html
Scadenza: Data la data e l'ora di risposta scaduti
Location: URL Per reindirizzare il destinatario di una richiesta di non luogo URL per completare la richiesta o l'identificazione di nuove risorse
Last-Modified: Data risorsa richiesta è stato modificato l'ultima volta
Content-Length: N richiesta Content-Length
Set-Cookie: String Impostazioni cookie HTTP

Variabili CGI ambiente

Tutti i programmi CGI hanno ricevuto le seguenti variabili d'ambiente, che ha svolto un ruolo importante nel programma CGI:

nome della variabile descrizione
CONTENT_TYPE Questo valore indica che la variabile d'ambiente per il tipo MIME di trasferimento di informazioni. Allo stato attuale, le variabili di ambiente sono generalmente CONTENT_TYPE: application / x-www-form-urlencoded, ha detto che i dati del modulo HTML.
CONTENT_LENGTH Se le informazioni di server modalità di trasferimento e programma CGI è POST, anche se l'ambiente lo STDIN variabile il numero di byte che possono essere letti dati validi dallo standard. Questa variabile di ambiente quando si leggono i dati di input deve essere utilizzato.
HTTP_COOKIE contenuti COOKIE all'interno del client.
HTTP_USER_AGENT Fornire informazioni includono il numero di versione del browser client o di altri dati proprietari.
PATH_INFO Il valore di questa variabile di ambiente indica il nome del programma CGI subito dopo le informazioni percorso aggiuntivo. Esso appare spesso come un programma di discussione CGI.
QUERY_STRING Se le informazioni del server modalità di trasferimento e programma CGI sono informazioni GET, il valore di questa variabile di ambiente, anche se passato. Questa informazione è seguito dal nome del programma CGI, sia al centro con un punto interrogativo '?' Separator.
REMOTE_ADDR Il valore di questa variabile ambiente è l'indirizzo IP del client invia una richiesta, ad esempio, quanto sopra 192.168.1.67. Questo valore è sempre presente. Ed è proprio la necessità di fornire al client Web di identificatore univoco del server Web può essere utilizzato in programmi CGI di distinguere tra diversi client Web.
REMOTE_HOST Il valore di questa variabile di ambiente contiene il nome host del client che richiede di CGI. In caso contrario si vuole controllare, non è necessario definire questa variabile di ambiente.
REQUEST_METHOD Esso fornisce un metodo chiamato script. Per script / protocollo HTTP 1.0 solo GET e POST significativo.
SCRIPT_FILENAME Il percorso completo di script CGI
SCRIPT_NAME Il nome dello script CGI
SERVER_NAME Questo è il nome host, alias, o l'indirizzo IP del server WEB.
SERVER_SOFTWARE Il valore di questa variabile di ambiente contiene la chiamata CGI nome del programma e il numero di versione del server HTTP. Ad esempio, il valore precedente di Apache / 2.2.14 (Unix)

Ecco un semplice variabili d'ambiente di output CGI script CGI:

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print '<meta charset="utf-8">';
print "<font size=+1>环境变量:</font>\n";
foreach (sort keys %ENV)
{
  print "<b>$_</b>: $ENV{$_}<br>\n";
}

1;

download

Se vogliamo raggiungere attraverso il download di file CGI Perl, richiede un diverso insieme di informazioni di intestazione come segue:

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

Utilizzare il metodo GET di trasferimento dei dati

metodo GET per inviare le informazioni all'utente codificato al server, le informazioni di dati è contenuta nella URL della richiesta di pagina di numero diviso come segue "?":

http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
GET richieste su alcuni degli altri commenti:
  • GET richiesta può essere memorizzato nella cache
  • richiesta GET rimane nella cronologia del browser
  • GET richieste possono essere contrassegnate
  • GET richieste non devono essere utilizzati quando si tratta di dati sensibili
  • GET richieste hanno limiti di lunghezza
  • GET richieste devono essere usati solo per recuperare i dati

Esempi di URL semplice: metodo GET

Il seguente è un semplice URL, utilizzando il metodo GET per inviare due parametri da programmare test.cgi:

/cgi-bin/test.cgi?name=本教程&url=http://www.w3big.com

Un file di codice test.cgi:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取文本信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET")
{
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$name = $FORM{name};
$url  = $FORM{url};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>$name网址:$url</h2>";
print "</body>";
print "</html>";

1;

Controllare il browser, i risultati di output sono i seguenti:

Esempi di forma semplice: metodo GET

Il seguente è un due inviare i dati al server utilizzando il metodo GET tramite un modulo HTML, presentato lo stesso documento test.cgi script del server, test.html codice è il seguente:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="get">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

implementazione del browser dei risultati è il seguente:


Utilizzare il metodo POST per passare i dati

Utilizzando il metodo POST per passare i dati al server è più sicuro e affidabile, come alcuni informazioni sensibili come le password degli utenti devono usare POST per trasferire i dati.

Il seguente è anche test.cgi, si può anche gestire POST dati del modulo presentato dal browser:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取文本信息
$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'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$name = $FORM{name};
$url  = $FORM{url};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>$name网址:$url</h2>";
print "</body>";
print "</html>";

1;

Il seguente è un due inviare i dati al server utilizzando il metodo GET tramite un modulo HTML, presentato lo stesso documento test.cgi script del server, test.html codice è il seguente:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

implementazione del browser dei risultati è il seguente:

programma CGI di passare i dati attraverso la casella di controllo

casella di controllo utilizzato nel sottoporre uno o più dati di opzione, test.html codice è il seguente:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="POST" target="_blank">
<input type="checkbox" name="w3big" value="on" /> 本教程
<input type="checkbox" name="google" value="on" /> Google
<input type="submit" value="选择站点" />
</form>
</body>
</html>

Un file di codice test.cgi:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$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'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
if( $FORM{w3big} ){
   $w3big_flag ="ON";
}else{
   $w3big_flag ="OFF";
}
if( $FORM{google} ){
   $google_flag ="ON";
}else{
   $google_flag ="OFF";
}

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2> 本教程选中状态 : $w3big_flag</h2>";
print "<h2> Google 选择状态 : $google_flag</h2>";
print "</body>";
print "</html>";

1;

implementazione del browser dei risultati è il seguente:


il trasferimento di dati via radio programma CGI

Radio solo trasferire dati a un server, test.html codice è il seguente:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<input type="radio" name="site" value="w3big" /> 本教程
<input type="radio" name="site" value="google" /> Google
<input type="submit" value="提交" />
</form>
</body>
</html>

codice di script test.cgi è il seguente:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$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'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$site = $FORM{site};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2> 选择的网站 $site</h2>";
print "</body>";
print "</html>";

1;

implementazione del browser dei risultati è il seguente:


il trasferimento dei dati tramite textarea programma CGI

passaggio textarea più righe di dati al server, test.html codice è il seguente:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<textarea name="textcontent" cols="40" rows="4">
在这里输入内容...
</textarea>
<input type="submit" value="提交" />
</form>
</body>
</html>

codice di script test.cgi è il seguente:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$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'};
}
# 读取 name/value 对信息
@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 '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>输入的文本内容为:$text_content</h2>";
print "</body>";
print "</html>";

1;

implementazione del browser dei risultati è il seguente:


programma CGI passare i dati attraverso la tendina

codice casella a discesa HTML come segue:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<select name="dropdown">
<option value="w3big" selected>本教程</option>
<option value="google">Google</option>
</select>
<input type="submit" value="提交"/>
</form>
</body>
</html>

codice di script test.cgi come segue:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$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'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$site = $FORM{dropdown};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>选择的网站是:$site</h2>";
print "</body>";
print "</html>";

1;

implementazione del browser dei risultati è il seguente:


CGI è usata Cookie

protocollo HTTP in un grande svantaggio è sbagliato giudicare l'identità di un utente, che danno ai programmatori una grande quantità di disagi, ma appare funzionalità cookie composta per questa carenza.

cookie che accede lo script mentre il cliente attraverso il browser del cliente sul disco rigido client per scrivere record di dati, recuperare dati quando un cliente visita il prossimo script, in modo da realizzare la funzione di determinare l'identità, biscotto comunemente utilizzato per verificare l'identità.

sintassi biscotto

dei cookie HTTP viene inviato attraverso l'header HTTP da raggiungere, ha dovuto trasferire i file, la sintassi intestazione set-cookie è la seguente:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name = Nome: per impostare il valore del cookie (nome non può essere utilizzato "," e "," numero), quando ci sono più valori nome ";" per separare, ad esempio: nome1 = nome1; nome2 = nome2 ; NAME3 = NAME3.
  • scade = Data: biscotto data di scadenza nel formato: scade = "GMG, DD Mon-AAAA HH: MM: SS"
  • path = percorso: il percorso impostato il supporto dei cookie, se il percorso è un percorso, il cookie per tutti i file e le sottodirectory della voce di directory in vigore, ad esempio: PATH = "/ cgi-bin /", se il percorso è un file, biscotto Si riferisce alla data di entrata in vigore di questo file, ad esempio: PATH = "/ cgi-bin / cookie.cgi".
  • domain = dominio: il nome di dominio del cookie è valido, ad esempio: domain = "www.w3big.com"
  • garantire: Se viene dato questo flag, che il cookie può essere trasmesso solo attraverso server HTTPS protocollo SSL.
  • cookie viene ricevuto impostando le variabili d'ambiente HTTP_COOKIE raggiunto, i programmi CGI possono ottenere informazioni recuperando la variabile biscotto.

impostazioni dei cookie

Impostazioni cookie è molto semplice, biscotto verranno inviati separatamente intestazione http. L'esempio seguente imposta la UserID, password e scade in un cookie:

#!/usr/bin/perl

print "Set-Cookie:UserID=XYZ;\n";
print "Set-Cookie:Password=XYZ123;\n";
print "Set-Cookie:Expires=Tuesday, 31-Dec-2017 23:12:40 GMT";\n";
print "Set-Cookie:Domain=www.w3big.com;\n";
print "Set-Cookie:Path=/perl;\n";
print "Content-type:text/html\r\n\r\n";
...........其他 HTML 内容

Trova Cookie

Cookie pagina recupero delle informazioni è molto semplice, in CGI variabili d'ambiente HTTP_COOKIE, il formato di memorizzazione è la seguente informazione cookie viene memorizzato:

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

L'output sopra esempio è:

User ID = XYZ
Password = XYZ123

modulo CGI

Perl CGI fornisce molti modulo built-in, utilizzare le due seguenti: