Variabili globali php:
Il processo che consente il passaggio dati fra pagine web è un mattone fondamentale per
la costruzione di siti dinamici.
La procedura che può apparire semplice genera il problema di superare le barriere
che spesso i diversi spazi web pongono al suo utilizzo.
In effetti gli script che troviamo in rete possono funzionare teoricamente su ogni spazio web
che supporta il linguaggio PHP. In pratica alcuni script si possono bloccare per i limiti
posti dal gestore dello spazio web e per il continuo progredire del linguaggio PHP.
Il limite che analizziamo adesso è quello generato dall'impostazione di
register_globals
register_globals Impostato su
ON permette di utilizzare le variabili globali solo
digitando il nome della variabile.
register_globals Impostato su
OFF permette di utilizzare le variabili globali solo
DOPO che sono state ricavate dall'array globale generato.
In questo articolo analizziamo
register_globals OFF
Descrizione:
Per passare dati fra pagine web il metodo da usare è il solito, ossia con variabili GET, POST
o SESSION.
Il problema lo riscontriamo quando sulla pagina di destinazione dobbiamo utilizzare le variabili
che abbiamo spedito.
In pratica dobbiamo ridefinire le variabili estraendole dall'array globale che è stato generato dal loro passaggio di pagina
Esempio:
Pagina di partenza:
....
....
<a href="pag_destinazione.php?ciao=1>....</a>//esempio di passaggio dati con GET
<form action="pag_destinazione.php" method="post">//esempio di passaggio dati con POST
....
<input type="text" name="ciao2" size=10 maxlength=10>
<input type="submit" value="Spedisci">
....
</form>
Pagina di destinazione:
$ciao=$_GET['ciao'];//Prendiamo la variabile dall'array globale $_GET
$ciao2=$_POST['ciao2'];//Prendiamo la variabile dall'array globale $_POST
....
....
Come abbiamo visto il loro utilizzo è molto semplice, basta ridefinire le variabili nella pagina
di destinazione.
Invio variabili con più metodi:
Può accadere che uno script possa inviare la stessa variabile con entrambi i metodi, tale invio non accade in contemporanea, ma avremo comunque la necessità di scegliere quale invio è stato effettuato per poter risalire alla variabile.
Possiamo recuperare la variabile con uno dei seguenti metodi:
Ciclo IF:
if ($_GET['ciao']==null){//Chiedo se il metodo GET è nullo
$ciao=$_POST['ciao'];//Se GET è nullo la variabile è POST
}
else{//Viceversa, se la variabile GET Non è nulla...
$ciao=$_GET['ciao'];//... utilizzo la variabile GET
}
Ciclo IF e funzione isset():
if(isset($_GET['ciao'])){$ciao=$_GET['ciao'];})
if(isset($_POST['ciao'])){$ciao=$_POST['ciao'];})
Sessioni:
Stesso metodo per ridefinire le variabili delle sessioni, dobbiamo solo usare la seguente
sintassi nella pagina di attivazione sessione:
<?
session_start();
...
...
$ciao=$_SESSION['ciao'];
?>
A partire dalla versione PHP 4.0.1 una delle grosse diversità che possiamo riscontrare con l'utilizzo delle variabili globali nelle sessioni, è che alcune delle funzioni che le caratterizzavano NON esistono più.
In pratica con l'utilizzo degli array globali
NON dobbiamo inserire le seguenti funzioni:
session_register()
session_is_registered()
session_unregister()
Possiamo usare le variabili di sessione come normali variabili globali, purché definite dopo la funzione
session_start();.
Se inseriamo anche i comandi
session_register() session_is_registered() session_unregister()
lo script funziona ugualmente, ma alla prima esecuzione potremo vedere un errore warning:
|
Warning: Unknown(): Your script possibly relies on a session side-effect which
existed until PHP 4.2.3. Please be advised that the session extension does not consider global
variables as a source of data, unless register_globals is enabled. You can disable this
functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to
off, respectively. in Unknown on line 0
|
Sicurezza:
Per aumentare la protezione dello script suggeriamo di
non spedire direttamente i valori da manipolare, ma delle variabili di controllo.
Esempio:
Se devo trasmettere un valore per aggiungere o modificare un dato (Y) in un database non
inserisco il dato (Y), ma un valore X.
Nella pagina di destinazione chiedo se il valore trasmesso è X, e di conseguenza sommo (uso) Y.
Questo se il dato Y è una costante, tuttavia è da evitare (se possibile) di trasmettere
i dati direttamente con URL (Metodo GET) o con i form (Metodo POST), questo perché
chiunque può vedere il codice e manometterlo.
Approfondiamo in pratica:
Immaginiamo di dover contare i clic in entrata su un sito per inserirlo nella top-ten del
nostro sito.
In questo caso ogni volta che clicchiamo sul sito dobbiamo aumentare di '1' il numero di
clic nel database.
Potrei scrivere una riga tipo:
<a href="redirect.php?clic=1&url=www.urlsito.it">Nome sito</a>
In questo caso
NON DEVO usare direttamente
$clic come variabile di
somma nel database. Questo perché un malintenzionato potrebbe utilizzare il nome della
variabile (
$clic) per generare un URL falso per generare un numero di clic superiore del tipo:
<a href="redirect.php?clic=1000&url=www.urlsito.it">Nome sito</a>
In questo caso se sommo $clic al valore del database con un solo collegamento il malintenzionato potrebbe aggiungere 1000 clic ad un sito...
Per non dare la possibilità di manipolare i dati dobbiamo usare (quando è possibile) le variabili delle query string come variabili di controllo per eventuali operazioni.
Nell'esempio precedente dovremo utilizzare $clic come un filtro, magari unita ad un semplice ciclo IF:
If ($clic==1){
$numeroclic=$numeroclic+1;
}
In questo modo abbiamo scongiurato ogni attacco diretto alle variabili, ed il nostro
malintenzionato non saprà mai come si chiama la variabile di somma (
$numeroclic).