Sito e pagine dinamiche
Contatti, questionari, iscrizioni ad eventi
Fabio Giovanetti
Liceo di Luino
Pagine statiche e dinamiche
- Le pagine realizzate con html/xhtml sono statiche, cioè il loro
contenuto è predeterminato e non dipende dall'interazione con l'utente
- Il contenuto delle cosiddette pagine dinamiche invece può cambiare
in parte o anche completamente sulla base di alcune azioni dell'utente
- Per realizzare pagine dinamiche occorre un linguaggio di programmazione
Linguaggi lato server
- I linguaggi di programmazione per il web sono di due tipi: lato client e lato server, a
seconda che vengano intrpretati ed eseguito dal client browser o dal server web
- Per i nostri scopi consiederemo degli esempi realizzati con un linguaggio lato server: il PHP
- Esempi analoghi si possono realizzare in ASP.
- Gli esempi presentati sono stati pensati per essere realizzati su di un server linux/apache, anche
se possono essere adattati ad altri tipi di server web (es. IIS di Microsoft), purché supportino il linguaggio PHP.
Invio di dati
- Lo strumento tipico di interazione tra l'utente che visita una pagina web e un programma
in PHP è il modulo (form)
- I dati inviati tramite form possono essere acquisiti da uno script php e assegnati a
delle variabili
- Esistono due metodi per passare dei dati tramite un modulo: GET e POST
- Il metodo GET passa i dati direttamente nelle URL e pertanto si presta a
manipolazioni da parte dell'utente che possono dar luogo ad effetti indesiderati o imprevisti
- Con il metodo POST l'invio di dati non è visibile all'utente
Variabili e form
- I dati inviati tramite i campi del modulo sono disponibili in opportuni array, identificati
dal valore dell'attributo name del campo.
- Nelle versioni di PHP a partire dalla 4.1.0 i dati inviati dai form sono disponibili tramite l'array
$_POST
- Nelle versioni precedenti occorre utilizzare $HTTP_POST_VARS
- Ad esempio il contenuto del campo identificato da name="UserName" è assegnato a
$_POST[UserName]
register_globals
- Il server web apache può essere anche configurato in modo che il valore del campo venga assegnato
ad una variabile con lo stesso nome.
- Ad esempio se name="User" il valore viene assegnato a $User
- La direttiva che permette ciò si chiama register_globals.
Rischi di register_globals On
- Si tratta di una scelta critica dal punto di vista della sicurezza, in quanto è facile passare
dei valori alle variabili semplicemente aggiungendo ?Nome_variabile=valore, in coda alla URL
- Purtroppo molti fornitori di hosting impostano la direttiva a On, per permettere di funzionare a vecchi script
Precauzioni
- Intanto controllare il valore impostato per register_globals
- Basta uno script php con la sola istruzione phpinfo();
- Se register_globals è impostato a On, se possibile modificare il valore
(alcuni fornitori lo consentono)
- Se non è possibile modificare tale valore, per sicurezza occorre sempre prevedere che una variabile
possa essere assegnata dall'utente
Modulo di contatto
- Un modulo di contatti permette di inviare email direttamente da una pagina del sito, senza che l'utente abbia un client di posta elettronica configurato
- L'esempio si compone di due parti:
- un file html che contiene un modulo, con nome, organizzazione, email e messaggio
- un file php che riceve i dati e li elabora
Modulo di contatto: il form
- Il form deve semplicemente contenere i campi richiesti per comporre il messaggio
- Bastano dei normali tag input e un textarea per il corpo del messaggio
Modulo di contatto: lo script
- Lo script php comprende varie parti:
- Vengono assegnati i dati del destinatario a delle opportune variabili
- Vengono recuperati i dati inviati dal form
- Se una dato non è assegnato, viene impostata una variabile vuota
- Viene controllato che l'email dell'utente sia corretta
- Viene composta una email di risposta
- Viene inviata l'email o in caso di errore viene visualizzato un messaggio per l'utente
- Se tutto funziona viene visualizzato un messaggio di feedback che riepiloga i dati inviati
La funzione mail()
- La funzione mail di php permette di inviare posta attraverso il mail transfer agent
o un server smtp
- Sintassi:
mail(indirizzo mittente, oggetto, corpo del messaggio, headers aggiuntivi)
- Gli headers aggiuntivi permettono di aggiungere From:indirizzo del mittente
- Rischio potenziale: un utente potrebbe usare gli headers aggiuntivi per aggiungere
altri destinatari (email injection, spamming)
Precauzioni
- Per evitare possibili email injections occorre controllare che l'email fornita
dall'utente sia corretta
- Per farlo possiamo usare le espressioni regolari
- PHP5 prevede dei filtri, con i quali è possibili controllare che una stringa
corrisponda al formato di un indirizzo email
Miglioramenti possibili
- Prevedere misure antispamming:
- captcha (problemi di accessibilità)
- altre strategie per distinguere umani e programmi
- In ogni caso il fatto far inviare i messaggi senza rendere pubblico l'indirizzo del destinatario
può essere un vantaggio
Modulo di iscrizione
- In questo esempio alcuni dati vengono salvati con un database mysql
- Lo scopo può essere un questionario online o un modulo di iscrizione
- In questo caso dovremo disporre anche di un database mysql
- Per creare la tabella nel database possiamo utilizzare PhpMyAdmin (interfaccia web di
amministrazione di mysql
PhpMyAdmin
- Con PhpMyAdmin possiamo:
- creare, eliminare, modificare le tabelle
- importare ed esportare i dati
- visualizzare e modificare i dati delle tabelle
- Se si dispone dei privilegi opportuni è possibile creare database e agire sugli utenti
(nel caso di un servizio di hosting l'utente non dispone di tali privilegi)
Iscrizione: la tabella
- La tabella questionario del database esempi contiene i seguenti campi:
- ID, intero, quattro cifre, chiave primaria, autoincrementale
- Data, timestamp, inserita automaticamente
- Nome, varchar di lunghezza 20
- Cognome, varchar di lunghezza 20
- Anno, intero, quattro cifre
- Provincia, varchar, due caratteri
- Email, varchar di lunghezza 30
- Possiamo anche importare la tabella usando il file questionario.sql
Iscrizione: il form
- Il form per l'invio dei dati prevede:
- input di tipo text per nome, cognome, anno di nascita ed email
- un select per scegliere la provincia da un elenco
- i campi nome, cognome ed email sono indicati come obbligatori
Iscrizione: lo script
- Lo script che deve inserire i dati nella tabella si compone di diverse parti:
- vengono recuperati i dati dall'array $_POST (facendo attenzione ad eventuali campi non definiti)
- vengono effettuati alcuni controlli sui campi
- viene effettuata la connessione al database
- vengono inseriti i dati nella tabella, tramite una query
- viene presentato un messaggio di feedback
Connessione al database
- Per connetteresi al server mysql occorronno:
- l'host (tipicamente tramite ip oppure se il server mysql
risiede sulla stessa macchina del server web 'localhost')
- il nome utente
- la password
- il nome del database
- Comandi:
- mysql_connect(host, utente, password
- mysql_select_db(database)
- Al termine del lavoro: mysql_close()
Query
- Comando:
mysql_query("INSERT INTO questionario ( Nome, Cognome, Anno, Provincia, Email)
VALUES ( '$Nome', '$Cognome', '$Anno', '$Provincia', '$Email')
- Serve a popolare la tabella questionario con i dati
- ID e timestamp vengono inseriti da mysql in modo automatico
Campi obbligatori
- Se un campo è obbligatorio occorre prevedere un controllo sulla variabile corrispondente
- Nel caso un dato non sia stato fornito si invita l'utente ad aggiungerlo (problema della conservazione
dei dati già inseriti)
Precauzioni
- Rischio tipico quando si usa un database: sql injections
- Inserendo dati con caratteri particolari è possibile alterare la query ed ottenere dei comportamenti
diversi da quelli previsti (anche molto pericolosi)
- Occorre prevedere dei controlli sui dati
- I caratteri pericolosi devono essere modificati (tipicamente con l'aggiunta di uno slash)
- PHP prevede una direttiva magic_quotes_gpc che aggiunge gli slash
- Se magic_quotes_gpc non è On (vedi phpinfo() ) è possibile usare funzioni come mysql_escape_string
Leggere i dati
- Lo script leggi.php fornisce un esempio di lettura della tabella
- In ogni caso è possibile usare anche PhpMyAdmin per esportare i dati (anche in
formati leggibili da altri programmi)
Miglioramenti
- Usare le variabili di sessione per memorizzare i dati nel caso si inviti l'utente a modificare qualcosa
- Spezzare la compilazione in più pagine
Credits e licenza
- Questa presentazione è realizzata con
S5 di Eric Meyer
- Si tratta di uno strumento per realizzare presentazioni scrivendo semplicemente un file html, quindi
con strumenti standard e non proprietari
- Eccetto dove diversamente specificato, i contenuti di questa presentazione sono rilasciati
sotto Licenza Creative Commons
