Nie ma czegoś takiego jak „bezpieczne” lub „niebezpieczne” wartości jako takie. Istnieją tylko wartości, które kontroluje serwer i wartości, które kontroluje użytkownik, i musisz być świadomy, skąd pochodzi wartość, a zatem czy można jej ufać w określonym celu. $_SERVER['HTTP_FOOBAR']
na przykład jest całkowicie bezpieczny do przechowywania w bazie danych, ale z całą pewnością nie byłoby to eval
możliwe.
W związku z tym podzielmy te wartości na trzy kategorie:
Kontrolowany przez serwer
Te zmienne są ustawiane przez środowisko serwera i zależą całkowicie od konfiguracji serwera.
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
Częściowo kontrolowane przez serwer
Te zmienne zależą od konkretnego żądania wysłanego przez klienta, ale mogą przyjmować tylko ograniczoną liczbę prawidłowych wartości, ponieważ wszystkie nieprawidłowe wartości powinny zostać odrzucone przez serwer sieciowy i nie powodować rozpoczęcia wywołania skryptu. Dlatego można je uznać za wiarygodne .
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* Podane REMOTE_
wartości to prawidłowy adres klienta, zweryfikowany przez uzgadnianie TCP / IP. Jest to adres, na który zostanie wysłana odpowiedź. REMOTE_HOST
polega jednak na odwrotnym wyszukiwaniu DNS i dlatego może zostać sfałszowany przez ataki DNS na twój serwer (w takim przypadku i tak masz większe problemy). Ta wartość może być proxy, co jest prostą rzeczywistością protokołu TCP / IP i nic nie można na to poradzić.
† Jeśli serwer sieciowy odpowiada na jakiekolwiek żądanie niezależnie od HOST
nagłówka, również powinno to być uznane za niebezpieczne. Zobacz Jak bezpieczny jest serwer $ _SERVER [„HTTP_HOST”]? .
Zobacz także http://shiflett.org/blog/2006/mar/server-name-versus-http-host .
‡ Zobacz 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
Całkowicie dowolne wartości kontrolowane przez użytkownika
Wartości te w ogóle nie są sprawdzane i nie zależą od konfiguracji serwera, są to całkowicie dowolne informacje przesłane przez klienta.
'argv'
, 'argc'
(dotyczy tylko wywołania CLI, zwykle nie dotyczy serwerów WWW)
'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'
(może zawierać skażone dane)
'PHP_SELF'
(może zawierać skażone dane)
'PATH_TRANSLATED'
- każda inna
'HTTP_'
wartość
§ Może być uważany za wiarygodny, o ile serwer sieciowy dopuszcza tylko niektóre metody żądań.
‖ Można uznać, że jest wiarygodne, jeśli uwierzytelnianie jest całkowicie obsługiwane przez serwer WWW.
Superglobal $_SERVER
zawiera również kilka zmiennych środowiskowych. To, czy są one „bezpieczne”, czy nie, zależy od tego, jak (i gdzie) zostały zdefiniowane. Mogą się one wahać od całkowicie kontrolowanych przez serwer do całkowicie kontrolowanych przez użytkownika.