La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

17 Novembre 2005Stefano Clemente1 Scrivere CGI con Perl Finora si è visto come creare semplici applicazioni Perl che restituiscano dei risultati sullo.

Presentazioni simili


Presentazione sul tema: "17 Novembre 2005Stefano Clemente1 Scrivere CGI con Perl Finora si è visto come creare semplici applicazioni Perl che restituiscano dei risultati sullo."— Transcript della presentazione:

1 17 Novembre 2005Stefano Clemente1 Scrivere CGI con Perl Finora si è visto come creare semplici applicazioni Perl che restituiscano dei risultati sullo standard output del computer che li esegue Attraverso CGI è possibile comunicare con il server web e con i suoi client permettendo ai programmi Perl di − ricevere l’input da Internet − restituire l’output su Internet

2 17 Novembre 2005Stefano Clemente2 Scrivere CGI con Perl CGI useLe funzioni utili per la scrittura di CGI in Perl sono contenute nel modulo CGI che può essere incluso in un programma attraverso l’istruzione use Attraverso la use si può indicare anche quali funzioni importare dal modulo specificato use CGI qw( :standard ); − Es: use CGI qw( :standard ); CGI richiede l’importazione di un insieme standard di funzioni dal modulo CGI

3 17 Novembre 2005Stefano Clemente3 Scrivere CGI con Perl printQuando si usa Perl per creare pagine web a contenuto dinamico, si usano le funzioni print per generare XHTML headerCGI Content-type: text/html\n\nPer generare un’intestazione HTTP valida, si utilizza la funzione header della libreria CGI, che restituisce la stringa “ Content-type: text/html\n\n ” start_html La funzione start_html genera i tag di apertura (,,, …, )

4 17 Novembre 2005Stefano Clemente4 Scrivere CGI con Perl Alcune informazioni addizionali come ad esempio gli attributi dei tag possono essere passate alle funzioni CGI nel modo seguente { => [,…, => ] } print ( start_html ( { dtd => "- //W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml 1-transitional.dtd", title => "Environment Variables..." } ) ); { => [,…, => ] } es: print ( start_html ( { dtd => "- //W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml 1-transitional.dtd", title => "Environment Variables..." } ) );

5 17 Novembre 2005Stefano Clemente5 Scrivere CGI con Perl TrtdthhrspandivbrEsistono varie funzioni che generano i tag HTML es: Tr, td, th, hr, span, div, br, ecc. end_htmlI tag di chiusura della pagina vengono generati con la funzione end_html

6 17 Novembre 2005Stefano Clemente6 Configurazione dei web server Le altre directory: cgi-bin Apache tratta diversamente il tentativo di accesso alla cgi-bin (comportamento dovuto alla definizione di default per questa directory in httpd.conf) − La directory cgi-bin è la directory usata da Apache per CGI (Common Gateway Interface) CGI è un protocollo standard per l’interazione degli utenti con applicativi sul server web L’interazione avviene attraverso l’esecuzione di programmi o script La directory sotto cui risiedono gli script e i programmi CGI è pur sempre una directory virtuale o alias, ma deve avere dei diritti diversi, deve cioè permettere al client web di eseguire programmi sul server

7 17 Novembre 2005Stefano Clemente7 Configurazione dei web server Le altre directory: cgi-bin Creiamo in cgi-bin il file test.pl (perl)

8 17 Novembre 2005Stefano Clemente8 cgi-bin: configurazione di IIS

9 17 Novembre 2005Stefano Clemente9 cgi-bin: configurazione di IIS

10 17 Novembre 2005Stefano Clemente10 cgi-bin: configurazione di IIS

11 17 Novembre 2005Stefano Clemente11 cgi-bin: configurazione di IIS

12 17 Novembre 2005Stefano Clemente12 cgi-bin: configurazione di IIS Bisogna aggiungere a IIS il supporto per PERL!!!

13 17 Novembre 2005Stefano Clemente13 cgi-bin: configurazione di IIS

14 17 Novembre 2005Stefano Clemente14 cgi-bin: configurazione di Apache Modifiche a httpd.conf − ScriptAlias /cgi-bin/ "C:/web/cgi-bin/" − AllowOverride None Options None Order allow,deny Allow from all Riavvio di Apache!!!

15 17 Novembre 2005Stefano Clemente15 Esempio 6: Variabili d’ambiente Le variabili d’ambiente contengono le informazioni riguardanti l’ambiente in cui viene eseguito lo script − Es. browser utilizzato, l’host HTTP, la connessione HTTP, ecc Le informazioni contenute nelle variabili d’ambiente possono essere utilizzate dal server web per generare pagine web specifiche per il particolare browser La variabile hash %ENV di Perl contiene i nomi e i valori di tutte le variabili d’ambiente L’esempio mostra uno script Perl che genera una pagina XHTML contenente nomi e valori delle variabili d’ambiente presentati in forma tabellare

16 17 Novembre 2005Stefano Clemente16 Esempio 6: Variabili d’ambiente #!c:\perl\bin\perl.exe # Fig : fig27_11.pl # Program to display CGI environment variables. use CGI qw( :standard ); $dtd = "-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"; \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"; print( header() ); print( start_html( { dtd => $dtd, title => "Environment Variables..." } ) ); title => "Environment Variables..." } ) ); print( "

" ); font-weight: bold\">" ); print( Tr( th( "Variable Name" ), th( "Value" ) ) ); th( "Value" ) ) ); print( Tr( td( hr() ), td( hr() ) ) ); foreach $variable ( sort( keys( %ENV ) ) ) { print( Tr( td( { style => "background-color: #11bbff" }, print( Tr( td( { style => "background-color: #11bbff" }, $variable ), $variable ), td( { style => "font-size: 12pt" }, td( { style => "font-size: 12pt" }, $ENV{ $variable } ) ) ); $ENV{ $variable } ) ) ); print( Tr( td( hr() ), td( hr() ) ) ); print( Tr( td( hr() ), td( hr() ) ) );} print( " " ); print( end_html() );
" ); font-weight: bold\">" ); print( Tr( th( "Variable Name" ), th( "Value" ) ) ); th( "Value" ) ) ); print( Tr( td( hr() ), td( hr() ) ) ); foreach $variable ( sort( keys( %ENV ) ) ) { print( Tr( td( { style => "background-color: #11bbff" }, print( Tr( td( { style => "background-color: #11bbff" }, $variable ), $variable ), td( { style => "font-size: 12pt" }, td( { style => "font-size: 12pt" }, $ENV{ $variable } ) ) ); $ENV{ $variable } ) ) ); print( Tr( td( hr() ), td( hr() ) ) ); print( Tr( td( hr() ), td( hr() ) ) );} print( " " ); print( end_html() );"> 17 Novembre 2005Stefano Clemente16 Esempio 6: Variabili d’ambiente #!c:\perl\bin\perl.exe # Fig. 27.11: fig27_11.pl # Program to display CGI environme

17 17 Novembre 2005Stefano Clemente17

18 17 Novembre 2005Stefano Clemente18

19 17 Novembre 2005Stefano Clemente19 Form e validazione dei dati Le form permettono di raccogliere dati dagli utenti e di inviare questi dati al server web per l’elaborazione POSTQuando l’utente fa una POST, i nomi dei campi della form e i valori assegnati agli stessi possono essere ricevuti da uno script che controlla la validità dei dati CGI param $ = param ( " " );La funzione del modulo CGI per accedere ai campi della form è la param $ = param ( " " );

20 17 Novembre 2005Stefano Clemente20 Esempio 7: form e validazione dati

21 17 Novembre 2005Stefano Clemente21

22 17 Novembre 2005Stefano Clemente22

23 17 Novembre 2005Stefano Clemente23 Esempio 7: form e validazione dati

24 17 Novembre 2005Stefano Clemente24 Esempio 7: form e validazione dati

25 17 Novembre 2005Stefano Clemente25 Esempio 7: form e validazione dati #!/usr/bin/perl # Fig : fig27_13.pl # Program to read information sent to the server # from the form in the fig27_12.xhtml document. use CGI qw( :standard ); $os = param( "os" ); $firstName = param( "fname" ); $lastName = param( "lname" ); $ = param( " " ); $phone = param( "phone" ); $book = param( "book" ); $dtd = "-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1- transitional.dtd"; \"http://www.w3.org/TR/xhtml1/DTD/xhtml1- transitional.dtd"; print( header() );

26 17 Novembre 2005Stefano Clemente26 Esempio 7: form e validazione dati print( start_html( { dtd => $dtd, title => "Form Results" } ) ); title => "Form Results" } ) ); if ( $phone =~ / ^ \( \d{3} \) \d{3} - \d{4} $ /x ) { print( "Hi " ); print( "Hi " ); print( span( { style => "color: blue; font-weight: bold" }, print( span( { style => "color: blue; font-weight: bold" }, $firstName ) ); $firstName ) ); print( "!" ); print( "!" ); print( "\nThank you for completing the survey." ); print( "\nThank you for completing the survey." ); print( br(), "You have been added to the " ); print( br(), "You have been added to the " ); print( span( { style => "color: blue; font-weight: bold" }, print( span( { style => "color: blue; font-weight: bold" }, $book ) ); $book ) ); print( " mailing list.", br(), br() ); print( " mailing list.", br(), br() ); print( span( { style => "font-weight: bold" }, print( span( { style => "font-weight: bold" }, "The following information has "The following information has been saved in our database: " ), br() ); been saved in our database: " ), br() );

27 17 Novembre 2005Stefano Clemente27 Esempio 7: form e validazione dati print( table( print( table( Tr( th( { style => "background-color: #ee82ee" }, Tr( th( { style => "background-color: #ee82ee" }, "Name" ), "Name" ), th( { style => "background-color: #9370db" }, th( { style => "background-color: #9370db" }, " " ), " " ), th( { style => "background-color: #4169e1" }, th( { style => "background-color: #4169e1" }, "Phone" ), "Phone" ), th( { style => "background-color: #40e0d0" }, th( { style => "background-color: #40e0d0" }, "OS" ) ), "OS" ) ), Tr( { style => "background-color: #c0c0c0" }, Tr( { style => "background-color: #c0c0c0" }, td( "$firstName $lastName" ), td( "$firstName $lastName" ), td( $ ), td( $ ), td( $phone ), td( $phone ), td( $os ) ) ) ); td( $os ) ) ) ); print( br() ); print( br() );

28 17 Novembre 2005Stefano Clemente28 Esempio 7: form e validazione dati print( div( { style => "font-size: x-small" }, print( div( { style => "font-size: x-small" }, "This is only a sample form. You have not been "This is only a sample form. You have not been added to a mailing list." ) ); added to a mailing list." ) );} else { print( div( { style => "color: red; font-size: x-large" }, print( div( { style => "color: red; font-size: x-large" }, "INVALID PHONE NUMBER" ), br() ); "INVALID PHONE NUMBER" ), br() ); print( "A valid phone number must be in the form " ); print( "A valid phone number must be in the form " ); print( span( { style => "font-weight: bold" }, print( span( { style => "font-weight: bold" }, "(555) " ) ); "(555) " ) ); print( div( { style => "color: blue" }, print( div( { style => "color: blue" }, "Click the Back button, and enter a "Click the Back button, and enter a valid phone number and resubmit." ) ); valid phone number and resubmit." ) ); print( br(), br() ); print( br(), br() ); print( "Thank you." ); print( "Thank you." );} print( end_html() );

29 17 Novembre 2005Stefano Clemente29 Server-Side Includes (SSI) Server-Side Includes (SSI) sono comandi inseriti in documenti XHTML che permettono la creazione di semplici contenuti dinamici Alcuni comandi SSI − EXEC − EXEC permette l’esecuzione di script CGI e inserisce l’output di questi direttamente nella pagina web − ECHOINCLUDE − ECHO e INCLUDE permettono di inserire nelle pagine web elementi che cambiano continuamente come l’orario o informazioni contenute in un database

30 17 Novembre 2005Stefano Clemente30 Server-Side Includes (SSI) Non tutti i web server supportano SSI, per cui i comandi vengono inseriti nelle pagine web come commenti.shtmlsI documenti contenenti i comandi SSI hanno solitamente estensione.shtml dove la s iniziale sta per server.shtmlI file.shtml sono analizzati dal server che esegue i comandi SSI, riscrive il documento con gli output dei comandi e lo invia al client

31 17 Novembre 2005Stefano Clemente31 Server-Side Includes (SSI) IIS è già configurato per l’esecuzione di SSI httpd.confApache richiede alcune modifiche al file httpd.conf.shtml AddType text/html.shtml AddOutputFilter INCLUDES.shtml − Le seguenti direttive permettono ad Apache di gestire i file.shtml AddType text/html.shtml AddOutputFilter INCLUDES.shtml.shtml Options +Includes − La direttiva seguente deve essere impostata nelle directory che contengono i file.shtml (in una sezione ): Options +Includes httpd.conf DocumentRoot "C:/web/html“ Options FollowSymLinks Options +Includes AllowOverride None − Nel caso del file httpd.conf visto finora DocumentRoot "C:/web/html“ Options FollowSymLinks Options +Includes AllowOverride None

32 17 Novembre 2005Stefano Clemente32 Esempio 8: SSI In questo esempio verrà mostrato un documento.shtml che − esegue uno script CGI per tenere traccia degli accessi alla pagina web appoggiandosi a un file su server nel quale memorizza il valore del contatore ECHO − esegue vari comandi ECHO per visualizzare il valore di alcune informazioni variabili − DATE_GMT − DOCUMENT_NAME − DATE_LOCAL − LAST_MODIFIED − REMOTE_ADDR − SERVER_NAME − SERVER_SOFTWARE − HTTP_USER_AGENT − GATEWAY_INTERFACE

33 17 Novembre 2005Stefano Clemente33 Esempio 8: SSI

34 17 Novembre 2005Stefano Clemente34 Esempio 8: SSI

35 17 Novembre 2005Stefano Clemente35 Esempio 8: SSI

36 17 Novembre 2005Stefano Clemente36 Esempio 8: SSI "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Using Server Side Includes Using Server Side Includes Using Server Side Includes Using Server Side Includes

37 17 Novembre 2005Stefano Clemente37 Esempio 8: SSI The Greenwich Mean Time is The Greenwich Mean Time is.. The name of this document is The name of this document is.. The local date is The local date is.. This document was last modified on This document was last modified on..

38 17 Novembre 2005Stefano Clemente38 Esempio 8: SSI Your current IP Address is Your current IP Address is.. My server name is My server name is.. And I am using the And I am using the Web Server. Web Server.

39 17 Novembre 2005Stefano Clemente39 Esempio 8: SSI You are using You are using.. This server is using This server is using..

font-size: xx-small"> This document was last modified on This document was last modified on..

40 17 Novembre 2005Stefano Clemente40 Esempio 8: SSI #!c:\perl\bin\perl.exe # esempio8.pl # Program to track the number of times a Web page has been accessed. use CGI qw( :standard ); open( COUNTREAD, "counter.dat" ); # apre il file in lettura $data = ; # legge una riga $data++; # incrementa di uno close( COUNTREAD ); # chiude counter.dat open( COUNTWRITE, ">counter.dat" ); # apre in scrittura print( COUNTWRITE $data ); # Scrive il valore ++ close( COUNTWRITE ); # chiude counter.dat print( header(), " “ ); print( "You are visitor number", br() ); for ( $count = 0; $count < length( $data ); $count++ ) { $number = substr( $data, $count, 1 ); $number = substr( $data, $count, 1 ); print( img( { src => "images/$number.gif" } ), "\n" ); print( img( { src => "images/$number.gif" } ), "\n" );} print( " " );

41 17 Novembre 2005Stefano Clemente41 Esempio 9: Verifica di Username e Password nomeutente,passwordIn questo esempio verrà mostrato un semplice metodo per l’autenticazione degli utenti basato su un elenco di utenti memorizzato su un file di testo (password.txt) nella forma nomeutente,password Lo script Perl introduce le istruzioni while ( $line = ) { … }while ( $line = ) { … } che ad ogni ciclo legge una riga dal file e termina quando viene raggiunta la fine del file chomp ( $line ); $linechomp ( $line ); che rimuove da $line il carattere di newline split ( “,”, $line ) $linesplit ( “,”, $line ) che divide la stringa contenuta in $line in due sottostringhe, quelle a destra e a sinistra della virgola.

42 17 Novembre 2005Stefano Clemente42 Esempio 9: file password.txt

43 17 Novembre 2005Stefano Clemente43 Esempio 9

44 17 Novembre 2005Stefano Clemente44 Esempio 9

45 17 Novembre 2005Stefano Clemente45 Esempio 9 Attenzione a proteggere i file con le password! IIS APACHE

46 17 Novembre 2005Stefano Clemente46 Esempio 9

47 17 Novembre 2005Stefano Clemente47 Esempio 9: file esempio9.html "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Verifying a username and a password Verifying a username and a password Type in your username and password below. Type in your username and password below.

font-weight: bold; font-size: x-small"> Note that the password will be sent as plain text. Note that the password will be sent as plain text.
Username: font-weight: bold">Username: Password: font-weight: bold">Password: Password: font-weight: bold">Password: "> 17 Novembre 2005Stefano Clemente48 Esempio 9: file esempio9.html <td style = User" title="17 Novembre 2005Stefano Clemente48 Esempio 9: file esempio9.html User">

49 17 Novembre 2005Stefano Clemente49 Esempio 9: file esempio9.pl #!c:\perl\bin\perl.exe # Fig : fig27_17.pl # Program to search a database for usernames and passwords. use CGI qw( :standard ); $dtd = "-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1- transitional.dtd"; \"http://www.w3.org/TR/xhtml1/DTD/xhtml1- transitional.dtd"; $testUsername = param( "username" ); $testPassword = param( "password" ); open( FILE, "password.txt" ) or die( "The database could not be opened." ); die( "The database could not be opened." );

50 17 Novembre 2005Stefano Clemente50 Esempio 9: file esempio9.pl while ( $line = ) { chomp( $line ); chomp( $line ); ( $username, $password ) = split( ",", $line ); ( $username, $password ) = split( ",", $line ); if ( $testUsername eq $username ) { if ( $testUsername eq $username ) { $userVerified = 1; $userVerified = 1; if ( $testPassword eq $password ) { if ( $testPassword eq $password ) { $passwordVerified = 1; $passwordVerified = 1; last; last; } }} close( FILE ); print( header() ); print( start_html( { dtd => $dtd, title => "Password Analyzed" } ) ); title => "Password Analyzed" } ) );

51 17 Novembre 2005Stefano Clemente51 Esempio 9: file esempio9.pl if ( $userVerified && $passwordVerified ) { accessGranted(); accessGranted();} elsif ( $userVerified && !$passwordVerified ) { wrongPassword(); wrongPassword();} else { accessDenied(); accessDenied();} print( end_html() ); sub accessGranted { print( div( { style => "font-face: arial; print( div( { style => "font-face: arial; color: blue; color: blue; font-weight: bold" }, font-weight: bold" }, "Permission has been granted, "Permission has been granted, $username.", br(), "Enjoy the site." ) ); $username.", br(), "Enjoy the site." ) );}

52 17 Novembre 2005Stefano Clemente52 Esempio 9: file esempio9.pl sub wrongPassword { print( div( { style => "font-face: arial; print( div( { style => "font-face: arial; color: red; color: red; font-weight: bold" }, font-weight: bold" }, "You entered an invalid password.", br(), "You entered an invalid password.", br(), "Access has been denied." ) ); "Access has been denied." ) );} sub accessDenied { print( div( { style => "font-face: arial; print( div( { style => "font-face: arial; color: red; color: red; font-size: larger; font-size: larger; font-weight: bold" }, font-weight: bold" }, "You have been denied access to this site." ) ); "You have been denied access to this site." ) );}

53 17 Novembre 2005Stefano Clemente53 Cookie HTTP è stateless I cookie permettono di mantenere le informazioni di stato per un client che sta utilizzando il web server I dati e i settaggi memorizzati nei cookie possono essere conservati anche tra più sessioni Microsoft Internet Explorer memorizza i cookie sull’hard disk del client come piccoli file di testo (es. C:\Documents and Settings\clest\Impostazioni locali\Temporary Internet Files\) Ogni volta che il client fa una richiesta, i dati contenuti nel cookie vengono inviati al server Il server può rispondere con XHTML specifico in base alle informazioni contenute nel cookie

54 17 Novembre 2005Stefano Clemente54 Esempio 10 In questo esempio verrà mostrata una pagina XHTML con una form attraverso la quale l’utente inserirà dei dati Quando l’utente cliccherà sul bottone “Write Cookie”, verrà eseguito uno script Perl che legge i dati inviati dall’utente, crea un cookie e restituisce all’utente una pagina nella quale conferma la creazione del cookie, visualizza i dati salvati e mostra un link per leggere il cookie Cliccando sul link viene eseguito uno script Perl che crea una pagina XHTML che visualizza i dati salvati nel cookie usando il colore preferito dall’utente

55 17 Novembre 2005Stefano Clemente55 Esempio 10

56 17 Novembre 2005Stefano Clemente56 Esempio 10

57 17 Novembre 2005Stefano Clemente57 Esempio 10

58 17 Novembre 2005Stefano Clemente58

59 17 Novembre 2005Stefano Clemente59 Esempio 10 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Writing a cookie to the client computer Writing a cookie to the client computer

font-weight: bold"> Click Write Cookie to save your cookie data. Click Write Cookie to save your cookie data.
style = "font-weight: bold"> Name: Name: Height: Height: Favorite Color: Favorite Color: