[precedente] Anti intrusione - Copertina - NWE [successivo]

Articolo


Rapido overview su PHP

PHP: Introduzione

Questo articolo non vuole in nessun modo essere né una guida esaustiva all'uso di php, né un articolo generico che ne elogia i meriti senza mai entrare nello specifico; è semplicemente la testimonianza di chi come me ha scoperto le immense potenzialità dell'HTML dinamico e la semplicità di utilizzo di uno strumento come il php integrato al potente web server apache. Per chi non ne avesse mai sentito parlare, per sommi capi, php è un modulo di apache (il server web più diffuso per sistemi unix) che consente, agendo assieme al web server, una gestione semplice, efficace ed esaustiva, di pagine web dinamiche, costituendo una soluzione completamente alternativa all'implementazione di cgi, javascript, e allo stesso tempo potrebbe esser visto come la alternativa unix agli asp della microsoft (a tale proposito per inciso esiste un convertitore asp2php che consente di passare dall'uno all'altro e che mi dicono funzioni molto bene; io francamente non ho mai avuto la necessità di utilizzarlo non avendo troppo in simpatia i prodotti proprietari microsoft). In questo articolo, del tutto generico, sarà posta particolare attenzione all'installazione di php (al momento in cui scrivo esiste la versione 3.0.7); verranno successivamente esposti alcuni esempi di utilizzo delle principali funzioni che toccheranno gli argomenti più disparati; nel prossimo articolo vedremo invece nel dettaglio come implementare sul proprio web-server un servizio rudimentale di lettura/scrittura di mail protetto da un'elementare forma di autenticazione realizzata in php. Ribadisco che l'articolo non è in nessun modo esaustivo sui concetti trattati, ma vuole essere una rapida introduzione con qualche esempio perché i più scettici si rendano conto delle effettive stupefacenti potenzialità di questo prodotto.

PHP: Installazione

Dovendo PHP interagire direttamente con il web server, occorre che venga compilato insieme proprio ad apache. Supporremo di seguito che esista sul nostro pc una versione funzionante di apache e che venga creato un link simbolico dalla directory /www che porti alla rootdir del web server. Così ad esempio se sulla mia macchina apache si trove installato in /usr/local/apache, occorrerà fare quanto segue :

ln -s /usr/local/apache /www

Supporremo inoltre che esista funzionante una versione di MySQL installata in /usr/local/mysql, tuttavia se non si intende implementare questa funzionalità sarà sufficiente eliminare il parametro --with-mysql all'atto della compilazione di php.
Vediamo quindi nel dettaglio quali pacchetti occorre reperire per portare a termine con successo l'installazione:

Sorgenti di Apache versione 1.3.6 oppure se fosse uscita una versione nuova la sezione web-servers su linuxberg
Sorgenti di php versione 3.0.7 oppure se fosse uscita una versione nuova la sezione develop-languages su linuxberg
Librerie GD 1.3 oppure se fosse uscita una versione nuova la sezione develop-libs su linuxberg
Imap 4.5 oppure se fosse uscita una versione nuova la sezione server-mail su linuxberg
Se intendete utilizzare il supporto per MySQL dovrete disporre ovviamente di una versione funzionante di MySQL disponibile sempre su linuxberg nella sezione Server-database

Poiché è possibile che abbiate in futuro bisogno di ricompilare php per implementare differenti funzioni, vi consiglio di lasciare nella directory /usr/src i sorgenti scompattati almeno di apache e php, nonchè di imap.

Una volta ottenuti i file necessari passiamo a scompattarli nella directory /usr/src come segue (supponiamo che li abbiate salvati nella directory /ftp che sul mio pc è un link simbolico a /home/ftp/pub):


cd /usr/src
tar xfvz /ftp/apache_1.3.6.tar.gz ./
tar xfvz /ftp/php-3.0.7.tar.gz ./
tar xfvz /ftp/imap-4.5.tar.Z
cd /usr/local/lib
tar xfvz /ftp/gd-1.3-4.tar.gz ./

Per prima cosa compiliamo le librerie gd in /usr/local/lib semplicemente digitando il comando make all'interno di /usr/local/lib/gd1.3-4, dopodiché passeremo alla configurazione di imap e alla compilazione di php:
per esser compilato con imap occorre non installare tutto il pacchetto, bensì esclusivamente una libreria ed alcuni header. Per compilare le librerie di imap occorre portarsi in /usr/src/imap-4.5 e digitare:


make sl4  # per un sistema libc5 che usa -lshadow
make slx  # per un sistema glibc che usa -lcrypt

una volta compilato occorre copiare alcuni file:

cp c-client/c-client.a /usr/local/lib
cp c-client/rfc822.h /usr/local/include
cp c-client/mail.h /usr/local/include
cp c-client/linkage.h /usr/local/include
ldconfig

Ora passiamo ad apache e php3:

cd /usr/src/apache_1.3.6
./configure --prefix=/www
cd ../php-3.0.7
./configure --with-mysql=/usr/local/mysql --with-apache=../apache_1.3.6 --with-imap --with-gd=/usr/local/lib/gd1.3-4 --enable-track-vars
make
make install
cd ../apache_1.3.6
./configure --prefix=/www --activate-module=src/modules/php3/libphp3.a
make

Ora dobbiamo copiare l'eseguibile appena compilato di apache nella sua directory di installazione; per far questo occorre che il demone httpd non sia in funzione: se lo fosse basta digitare 'kill -9 httpd' , dopodiché si può copiare il nuovo:

cp src/httpd /www/bin

Ora copiamo il file di inizializzazione di php (editatelo semmai per rispondere meglio alle vostre esigenze) :


cd ../php-3.0.7
cp php3.ini-dist /usr/local/lib/php3.ini

Ultimo passo è editare il file di configurazione di apache per fargli sapere che esistono le estensioni php che vogliamo, quindi occorrerà che tra gli AddType del file /www/conf/httpd.conf ci siano:


AddType application/x-httpd-php3 .php3
AddType application/x-httpd-php3 .phtml
AddType application/x-httpd-php3-source .phps

Vedrete che la ultima riga diverrà particolarmente utile in fase di debug degli errori che inevitabilmente si commettono quando si scrive un po' di codice.

Finalmente abbiamo finito la fase di installazione e possiamo passare a divertirci con le funzionalità di php, ma prima dobbiamo ovviamente riavviare httpd semplicemente digitando /www/bin/httpd
Alleluja... comincia il divertimento.

PHP: Primi passi


Il primo passo è ovviamente la verifica che il modulo php sia effettivamente installato e funzionante; per far questo creiamo subito la nostra prima pagina php con un file che chiameremo test.phtml così fatto:


--begin file test.phtml--
<?php

echo "Ciao mondo! (mi sembra familiare!!??)<BR>";
 ?>
Facile, no ?
--end file test.phtml--

La pagina va memorizzata nella root o in una sottodirectory della root del webserver, poiché la dovrete richiamare da Netscape (o altro browser) collegandovi a 'localhost', altrimenti la pagina non viene interpretata dal webserver e viene visualizzata dal browser come una pagina html locale. Se tutto funziona correttamente vedrete la scritta:

Ciao mondo! (mi sembra familiare!!??)
Facile, no ?

Ed andando a visualizzare il sorgente vi accorgerete che sono scomparse tutte le righe di codice all'interno dei tag <?php ... ?> ad eccezione di quanto vogliamo mandare in output con il comando echo.
Da questo primo piccolo test possiamo subito renderci conto di come generare contenuto html da un file php: con il comando echo, e a tale proposito vediamone rapidamente la sintassi:


echo "stringa da visualizzare".$variabiledavisualizzare.
"altra stringa" 
... ;

Tramite il comando echo mandiamo in output il sorgente della pagina html che l'utente vedrà; tutto cio che è preceduto dal simbolo del "$" viene interpretato e tradotto come una variabile; per visualizzare una riga che debba essere composta da stringhe fisse e variabili possiamo utilizzare l'operatore '.' che si occupa di concatenare delle stringhe, oppure strutturare una serie di comandi echo. Del tutto equivalente al caso precedente sarebbe stato un costrutto del tipo:


echo "stringa da visualizzare";
echo $variabiledavisualizzare;
echo " altra stringa";

Vediamo anche subito un altro importante elemento di php: ogni comando è separato dal successivo mediante l'operatore ";"
Chi ha un po' di dimestichezza con il C si sarà accorto che la sintassi di php è molto simile, in effetti andando a spulciare la reference guide di PHP si trovano molti costrutti del tutto simili.

Un'altra informazione che possiamo trarre dal primo test è che non è necessario che una pagina .phtml sia scritta interamente in php: si può tranquillamente utilizzare la sintassi tradizionale dell'html, e poi quando ve ne sia la necessità inserire codice php mediante i tag <?php ...?>

PHP: Comandi più comuni

Non posso, per esigenze di spazio, dilungarmi in questa sede sulla sintassi e le sottigliezze, fornirò di seguito una spcie di tips che consentiranno di utilizzare con successo le più comuni funzionalità php.

Comando echo

Ne abbiamo visto sopra un utilizzo sommario; ci sono però in questa maniera dei caratteri che non possono esser visualizzati, come ad esempio il "$" o i doppi apici; per utilizzarli occorre farli precedere dal "\" che, proprio come in C, dice al compilatore di non interpretare il carattere che segue, ma di trattarlo come semplice testo.

Variabili - assegnazione

Abbiamo detto che in php una variabile è identificata dal segno di "$" che la precede. Non è necessario dichiarare il tipo di variabile che si intende utilizzare, all'atto dell'inizializzazione le viene assegnato automaticamente un tipo; fondamentalmente si ha a che fare con tipi "int" (interi) e tipi "string" (stringhe). Non esistono in php i tipi "boolean" TRUE e FALSE. L'operatore di assegnazione è "=", quindi :


$intero=5 assegnerà alla variabile intero il valore 5
$stringa="Ciao mi chiamo Paolo" assegnerà alla variabile stringa il valore "Ciao mi chiamo Paolo"
$secondointero=$intero+2 assegnerà alla variabile $secondointero il valore 7

Potete divertirvi a verificare l'output di questo secondo test:


--begin file test2.phtml --
<?php
$a=1 ;
$b=4 ;
$nome1="\"Paolo " ;

$nome2="sono " ;

$nome3="io \"" ;

$nome4=$nome1.$nome2.$nome3 ;

echo $a."<BR>";

echo $a++."<BR>";

echo $a+$b."<BR>";

$a=1;

echo ++$a."<BR>";

echo $a+$b."<BR>";

echo $nome1.$nome2.$nome3."<BR>" ;

echo $nome4."<BR>";
?>
--end file test2.phtml --

Passaggio di variabili da una pagina all'altra - Visualizzazione dei campi di un form

La cosa che più mi ha colpito di php è la straordinaria versatilità con cui si passano le variabili. Ricordate i noiosissimi cgi che si dovevano occupare del parsing delle variabili che venivano passate da una pagina all'altra? ...dimenticateli: con php potete passare le variabili e renderle disponibili per il trattamento ad una pagina successiva semplicemente chiamandole per nome e dandogli un valore. Il classico utilizzo di questo tipo si ha passando tramite un form delle variabili. Supponiamo quindi di avere una pagina form.html che passa dati ad una pagina formoutput.phtml . Il form di form.html è così strutturato:


--begin file form.html --
<FORMMETHOD="POST" ACTION="formoutput.phtml">
<INPUTTYPE="text" name="mionome" value="">
<BR>
<INPUTTYPE="text" name="miocognome" value="">
<BR>
<INPUTTYPE="submit" value="stupiscimi">
</INPUT>
</FORM>
--end file form.html --

Questa form genererà una chiamata del tipo: http://localhost/formoutput.phtml?mionome=valore1&miocognome=valore2

dove ovviamente i due valori sono il testo che voi avete inserito nei campi text; ebbene ora stupiamoci del fatto che la pagina che viene chiamata avrà già fatto da sé il parsing della stringa passatale e saprà già che la variabile $mionome sarà "valore1" mentre $miocognome sarà "valore2".
Verifichiamolo implementando il file formoutput.phtml :


--begin file formoutput.phtml --
<?php

echo $mionome."<BR>";

echo $miocognome."<BR>";
 ?>
--end file formoutput.phtml --

È inutile che vi stia ad enunciare le possibili applicazioni di questo tipo di costrutti; capirete che potete portarvi appresso per tutte le pagine che desiderate qualsiasi variabile generata all'interno di un'altra pagina. È altrettanto inutile dirvi che se io passo una variabile anch'essa viene interpretata ed assegnata al suo identificativo:

--begin file passami.phtml--
<?php
$nomevar="Ciao caro";
echo "<A HREF=\"passato.phtml?quelchevoglio=$nomevar&veramente=si\">Clikkami</A>";
 ?>
--end file passami.phtml--

--begin file passato.phtml--
<?php
echo $quelchevoglio."<BR>";
echo $veramente;
 ?>
--end file passato.phtml--

Avrete certamente già capito che quello che vogliamo fare in questa sede è implementare una pagina php che ci consenta di emulare formmail, il cgi in perl che consente di inviare una e-mail a partire da una interfaccia web riempiendo dei campi testo.

Il comando mail


Questa la sintassi, presa direttamente dal reference manual, di "mail" che non credo debba spiegarvi a cosa serve:

void mail (string to, string subject, string message, string additional_headers)

Ovvero per capirci:


mail ("gabanaz@usa.net" , "Ho letto con piacere il tuo articolo sul
PLJ" , "Ciao Paolo \n Hai scritto un bellissimo articolo \n Tua Ludovica"
, "From: ludovica@sexynet.com");

Anche variabili stringa sono bene accette.

A questo punto abbiamo tutti gli strumenti per implementare il nostro formphpmail.

PHP: FormPhpMail


--begin file formphpmail.html--
<FORMMETHOD="POST" ACTION="formphpmail.phtml">
<B>To :</B>
<INPUTTYPE="text" name="destinatario">
<BR>:
<B>From :</B>
<INPUTTYPE="text" name="mittente">
<BR>
<B>Subject :</B>
<INPUTTYPE="text" name="subject">
<BR>
<B>Messaggio :</B>
<BR>
<textarea name="messagebody" rows=6 cols=50>
</textarea>
<BR>
<INPUTTYPE="submit" value="Invia">
</FORM>
--end file formphpmail.html--

--begin file formphpmail.phtml-- <?php mail ("$destinatario" , "$subject" , "$messagebody" , "From: $mittente\nX-Mailer: PHP /".phpversion()); echo "The following email was sent:"; echo "<BR><BR><BR>"; echo "Mail To: $destinatario<BR>"; echo "From: $mittente<BR>"; echo "X-Mailer: PHP/".phpversion()."<BR>"; echo "Subject: $subject<BR><BR>"; echo "$messagebody"; ?> --end file formphpmail.phtml--

Il funzionamento dei due file, dopo aver letto il contenuto di questo articolo, è abbastanza intuitivo e non mi ci dilungherò ulteriormente.
Anticipo ai lettori che non è stato, per motivi di chiarezza e semplicità, trattato il campo fondamentale della gestione degli errori; è forse necessario per rendere operativo il tutto effettuare dei controlli sulle variabili, mediante il comando ereg_replace, che verrà affrontato nel prossimo articolo; per il momento è tutto.

di Paolo Dell'Unto


[precedente] Anti intrusione - Copertina - NWE [successivo]