Quali variabili $ _SERVER sono sicure?


97

Qualsiasi variabile che un utente può controllare, un utente malintenzionato può anche controllare ed è quindi fonte di un attacco. Questa è chiamata variabile "contaminata" e non è sicura.

Quando si utilizza $_SERVER, molte delle variabili possono essere controllate. PHP_SELF, HTTP_USER_AGENT, HTTP_X_FORWARDED_FOR, HTTP_ACCEPT_LANGUAGEE molti altri sono una parte della richiesta HTTP inviata dal client.

Qualcuno sa di una "lista sicura" o di una lista di $_SERVERvariabili non contaminata ?


8
Dipende da come definisci "sicuro". I valori sono tutti sicuri così come sono, dipende solo per cosa li usi.
ingannare

6
Penso che in questo contesto, Rook stia dicendo "Quali variabili del server non possono essere falsificate dall'utente", ad esempio REMOTE_ADDR.
vcsjones

6
Qualsiasi cosa preceduta da HTTP_è un'intestazione di richiesta e può essere impostata dal browser o dal proxy in mezzo. Li considererei come qualsiasi altro input dell'utente.
datasage

3
@ bob-the-destroyer REMOTE_ADDR viene estratto direttamente dal socket TCP di apache, questo valore non può essere falsificato su Internet a causa dell'handshake a tre vie.
torre

2
@Rook: buon punto. Immagino che con la menzione di "spoofing", fossi più incline al vecchio atto di ip spoofing stesso, piuttosto che a qualsiasi tipo di falsificazione del valore effettivo di REMOTE_ADDR. E questo sarebbe fuori dallo scopo di questa domanda. Tuttavia, è utile avere un'idea di come viene impostato questo valore, quindi grazie.
bob-the-destroyer

Risposte:


147

Non esistono valori "sicuri" o "non sicuri" in quanto tali. Esistono solo valori controllati dal server e valori controllati dall'utente ed è necessario essere consapevoli della provenienza di un valore e quindi se può essere considerato attendibile per un determinato scopo. $_SERVER['HTTP_FOOBAR']per esempio è del tutto sicuro da memorizzare in un database, ma sicuramente non evallo farei .

Pertanto, suddividiamo questi valori in tre categorie:

Controllato dal server

Queste variabili vengono impostate dall'ambiente del server e dipendono interamente dalla configurazione del server.

  • 'GATEWAY_INTERFACE'
  • 'SERVER_ADDR'
  • 'SERVER_SOFTWARE'
  • 'DOCUMENT_ROOT'
  • 'SERVER_ADMIN'
  • 'SERVER_SIGNATURE'

Parzialmente controllato dal server

Queste variabili dipendono dalla richiesta specifica inviata dal client, ma possono assumere solo un numero limitato di valori validi, poiché tutti i valori non validi dovrebbero essere rifiutati dal server web e non causare l'invocazione dello script con cui iniziare. Quindi possono essere considerati affidabili .

  • 'HTTPS'
  • 'REQUEST_TIME'
  • 'REMOTE_ADDR' *
  • 'REMOTE_HOST' *
  • 'REMOTE_PORT' *
  • 'SERVER_PROTOCOL'
  • 'HTTP_HOST'
  • 'SERVER_NAME'
  • 'SCRIPT_FILENAME'
  • 'SERVER_PORT'
  • 'SCRIPT_NAME'

* Si REMOTE_garantisce che i valori siano l'indirizzo valido del client, come verificato da un handshake TCP / IP. Questo è l'indirizzo a cui verrà inviata qualsiasi risposta. REMOTE_HOSTsi basa però su ricerche DNS inverse e può quindi essere falsificato da attacchi DNS contro il tuo server (nel qual caso hai comunque problemi più grandi). Questo valore può essere un proxy, che è una semplice realtà del protocollo TCP / IP e nulla su cui puoi fare nulla.

† Se il tuo server web risponde a qualsiasi richiesta indipendentemente HOSTdall'intestazione, anche questa dovrebbe essere considerata non sicura. Vedi Quanto è sicuro $ _SERVER [“HTTP_HOST”]? .
Vedi anche http://shiflett.org/blog/2006/mar/server-name-versus-http-host .

‡ Vedere https://bugs.php.net/bug.php?id=64457 , http://httpd.apache.org/docs/current/mod/core.html#usecanonicalphysicalport , http: //httpd.apache. org / docs / 2.4 / mod / core.html # comment_999

Valori controllati dall'utente completamente arbitrari

Questi valori non sono controllati affatto e non dipendono da alcuna configurazione del server, sono informazioni del tutto arbitrarie inviate dal client.

  • 'argv', 'argc'(applicabile solo al richiamo della CLI, di solito non è un problema per i server web)
  • 'REQUEST_METHOD' §
  • 'QUERY_STRING'
  • 'HTTP_ACCEPT'
  • 'HTTP_ACCEPT_CHARSET'
  • 'HTTP_ACCEPT_ENCODING'
  • 'HTTP_ACCEPT_LANGUAGE'
  • 'HTTP_CONNECTION'
  • 'HTTP_REFERER'
  • 'HTTP_USER_AGENT'
  • 'AUTH_TYPE'
  • 'PHP_AUTH_DIGEST'
  • 'PHP_AUTH_USER'
  • 'PHP_AUTH_PW'
  • 'PATH_INFO'
  • 'ORIG_PATH_INFO'
  • 'REQUEST_URI' (può contenere dati contaminati)
  • 'PHP_SELF' (può contenere dati contaminati)
  • 'PATH_TRANSLATED'
  • qualsiasi altro 'HTTP_'valore

§ Può essere considerato affidabile fintanto che il server web consente solo determinati metodi di richiesta.

‖ Può essere considerato affidabile se l'autenticazione è gestita interamente dal server web.

Il superglobale $_SERVERinclude anche diverse variabili d'ambiente. Se questi sono "sicuri" o meno dipende da come (e dove) sono definiti. Possono variare da completamente controllato dal server a completamente controllato dall'utente.


3
@Rook Ma come ho detto, dipende assolutamente da come lo usi . I valori da soli non sono né sicuri né pericolosi, dipende da cosa li usi . Anche i dati inviati da un utente malvagio sono perfettamente al sicuro fintanto che non stai facendo nulla con essi che possa compromettere la tua sicurezza.
inganno

2
@Rook: la tua idea di "sicuro" fa sembrare questa domanda un po 'arbitraria, soprattutto perché è interamente legata a un'oscura estensione o versione personalizzata di PHP. Sebbene tu dica "non dovrebbe avere un" approccio alla moda "", qualsiasi risposta sembra effettivamente richiedere una familiarità minima con il codice sorgente PHP per scoprire come sono impostati questi valori. Inviare e-mail agli sviluppatori PHP non sarebbe un approccio migliore per trovare una risposta?
bob-the-destroyer

2
@Rook: errore di comunicazione. Come accennato inganno, "sicuro per quale scopo". Come ho accennato, il tuo scopo è sconosciuto e inoltre ci sono molti altri $_SERVERvalori non documentati a seconda di come viene servito il file. A mio parere, quelli documentati non chiariscono la vera fonte. Altrimenti credo che non faresti questa domanda. Sono contento che tu abbia una lista che puoi usare. Ma suggerirei comunque di inviare una segnalazione di bug (quando il loro sito di bug è stato corretto), di inviare un'e-mail ai manutentori dei documenti o di aggiornare i documenti da soli (se sei a conoscenza del collegamento). Sarebbe utile alla comunità conoscere queste informazioni.
bob-the-destroyer

3
SERVER_NAMEnon è necessariamente controllato dal server. A seconda del gateway e delle impostazioni, potrebbe essere duplicato HTTP_HOSTe quindi soggetto allo stesso avvertimento.
bobince

1
@deceze @Rook fa SERVER_PORTbisogno che piccola croce? bugs.php.net/bug.php?id=64457
Dejan Marjanović

12

In PHP ogni $_SERVERvariabile che inizia con HTTP_può essere influenzata dall'utente. Ad esempio, la variabile $_SERVER['HTTP_REINERS']può essere contaminata impostando l'intestazione HTTP REINERSsu un valore arbitrario nella richiesta HTTP.


re "arbitrario"; Non del tutto arbitrario in quanto conformi a un formato. Ad esempio, $_SERVER['HTTP_REINERS'] non può contenere caratteri di nuova riga nella maggior parte dei sapis.
Pacerier
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.