Es gibt keine "sicheren" oder "unsicheren" Werte als solche. Es gibt nur Werte, die der Server steuert, und Werte, die der Benutzer steuert. Sie müssen wissen, woher ein Wert stammt und ob er für einen bestimmten Zweck vertrauenswürdig ist. $_SERVER['HTTP_FOOBAR']
Zum Beispiel ist es völlig sicher, in einer Datenbank zu speichern, aber ich würde eval
es mit Sicherheit nicht tun.
Teilen wir diese Werte daher in drei Kategorien ein:
Servergesteuert
Diese Variablen werden von der Serverumgebung festgelegt und hängen vollständig von der Serverkonfiguration ab.
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
Teilweise servergesteuert
Diese Variablen hängen von der spezifischen Anforderung ab, die der Client gesendet hat, können jedoch nur eine begrenzte Anzahl gültiger Werte annehmen, da alle ungültigen Werte vom Webserver zurückgewiesen werden sollten und nicht dazu führen, dass der Aufruf des Skripts beginnt. Daher können sie als zuverlässig angesehen werden .
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
* *
'REMOTE_HOST'
* *
'REMOTE_PORT'
* *
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* Die REMOTE_
Werte sind garantiert die gültige Adresse des Clients, die durch einen TCP / IP-Handshake überprüft wurde. Dies ist die Adresse, an die eine Antwort gesendet wird. REMOTE_HOST
stützt sich jedoch auf Reverse-DNS-Lookups und kann daher durch DNS-Angriffe auf Ihren Server gefälscht werden (in diesem Fall haben Sie ohnehin größere Probleme). Dieser Wert kann ein Proxy sein, was eine einfache Realität des TCP / IP-Protokolls ist und nichts, gegen das Sie etwas tun können.
† Wenn Ihr Webserver unabhängig vom Header auf eine Anfrage reagiert HOST
, sollte dies ebenfalls als unsicher angesehen werden. Siehe Wie sicher ist $ _SERVER ["HTTP_HOST"]? .
Siehe auch http://shiflett.org/blog/2006/mar/server-name-versus-http-host .
‡ Siehe 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
Völlig beliebige benutzerdefinierte Werte
Diese Werte werden überhaupt nicht überprüft und hängen nicht von einer Serverkonfiguration ab. Es handelt sich um völlig willkürliche Informationen, die vom Client gesendet werden.
'argv'
, 'argc'
(gilt nur für CLI-Aufrufe, normalerweise nicht für Webserver)
'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'
(kann verdorbene Daten enthalten)
'PHP_SELF'
(kann verdorbene Daten enthalten)
'PATH_TRANSLATED'
- jeder andere
'HTTP_'
Wert
§ Kann als zuverlässig angesehen werden, solange der Webserver nur bestimmte Anforderungsmethoden zulässt.
‖ Kann als zuverlässig angesehen werden, wenn die Authentifizierung vollständig vom Webserver durchgeführt wird.
Das Superglobal $_SERVER
enthält auch mehrere Umgebungsvariablen. Ob diese "sicher" sind oder nicht, hängt davon ab, wie (und wo) sie definiert sind. Sie können von vollständig servergesteuert bis vollständig benutzergesteuert reichen.