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 eval
lo 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_HOST
si 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 HOST
dall'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 $_SERVER
include 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.