Jede Variable, die ein Benutzer steuern kann, kann auch ein Angreifer steuern und ist daher eine Angriffsquelle. Dies wird als "verdorbene" Variable bezeichnet und ist unsicher.
Bei der Verwendung $_SERVER
können viele der Variablen gesteuert werden. PHP_SELF
, HTTP_USER_AGENT
, HTTP_X_FORWARDED_FOR
, HTTP_ACCEPT_LANGUAGE
Und viele andere sind ein Teil der HTTP - Request - Header durch den Client gesendet.
Kennt jemand eine "sichere Liste" oder eine unbefleckte Liste von $_SERVER
Variablen?
REMOTE_ADDR
.HTTP_
ist , ist ein Anforderungsheader und kann vom Browser oder Proxy dazwischen festgelegt werden. Ich würde diese als jede andere Benutzereingabe betrachten.REMOTE_ADDR
. Und das wäre nicht Gegenstand dieser Frage. Gut, um einen Einblick zu bekommen, wie dieser Wert eingestellt wird, also danke.Antworten:
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ürdeeval
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'
'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.quelle
$_SERVER
Werte, je nachdem, wie die Datei bereitgestellt wird. Meiner Meinung nach klären die dokumentierten nicht die wahre Quelle. Sonst würden Sie diese Frage wohl nicht stellen. Ich bin froh, dass du eine Liste hast, die du verwenden kannst. Ich würde dennoch empfehlen, einen Fehlerbericht einzureichen (wenn die Fehler-Site behoben ist), den Dokumentbetreuern eine E-Mail zu senden oder die Dokumente selbst zu aktualisieren (wenn Sie mit dem Link vertraut sind). Es wäre für die Community von Vorteil, diese Informationen zu kennen.SERVER_NAME
wird nicht unbedingt vom Server gesteuert. Abhängig vom Gateway und den Einstellungen kann es dupliziert werdenHTTP_HOST
und unterliegt daher derselben Einschränkung.SERVER_PORT
das kleine Kreuz? bugs.php.net/bug.php?id=64457In PHP kann jede
$_SERVER
Variable, die mit beginntHTTP_
, vom Benutzer beeinflusst werden. Zum Beispiel kann die Variable$_SERVER['HTTP_REINERS']
beschädigt werden, indem der HTTP-HeaderREINERS
in der HTTP-Anforderung auf einen beliebigen Wert gesetzt wird.quelle
$_SERVER['HTTP_REINERS']
enthalten , können nicht Zeilenumbrüche unter den meisten SAPIs.