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.