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
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=value2GET 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: