Descrizione, utilizzo ed errori correlati alle variabili globali di PHP
ALLWEB free
Directory Web Script Linguaggi
Italiano Inglese Tutte
 
 20 Feb 2017
aggiungi in preferiti  
Home    Mappa directory    Script




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).