Il n'existe pas de valeurs «sûres» ou «non sûres» en tant que telles. Il n'y a que les valeurs que le serveur contrôle et les valeurs que l'utilisateur contrôle et vous devez savoir d'où vient une valeur et donc si elle peut être approuvée dans un certain but. $_SERVER['HTTP_FOOBAR']
par exemple, il est tout à fait sûr de stocker dans une base de données, mais je ne le ferais certainement pas eval
.
En tant que tel, divisons ces valeurs en trois catégories:
Contrôlé par le serveur
Ces variables sont définies par l'environnement du serveur et dépendent entièrement de la configuration du serveur.
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
Contrôlé en partie par le serveur
Ces variables dépendent de la demande spécifique envoyée par le client, mais ne peuvent accepter qu'un nombre limité de valeurs valides, car toutes les valeurs non valides doivent être rejetées par le serveur Web et ne pas déclencher l'appel du script. Par conséquent, ils peuvent être considérés comme fiables .
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* Les REMOTE_
valeurs sont garanties comme étant l'adresse valide du client, comme vérifié par une poignée de main TCP / IP. Il s'agit de l'adresse à laquelle toute réponse sera envoyée. REMOTE_HOST
repose sur des recherches DNS inversées et peut donc être usurpé par des attaques DNS contre votre serveur (auquel cas vous avez de toute façon de plus gros problèmes). Cette valeur peut être un proxy, ce qui est une simple réalité du protocole TCP / IP et vous ne pouvez rien faire.
† Si votre serveur Web répond à une demande quel que soit l'en- HOST
tête, cela doit également être considéré comme dangereux. Voir Dans quelle mesure $ _SERVER ["HTTP_HOST"] est-il sûr? .
Voir également http://shiflett.org/blog/2006/mar/server-name-versus-http-host .
‡ Voir 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
Valeurs contrôlées par l'utilisateur entièrement arbitraires
Ces valeurs ne sont pas du tout vérifiées et ne dépendent d'aucune configuration de serveur, ce sont des informations entièrement arbitraires envoyées par le client.
'argv'
, 'argc'
(applicable uniquement à l'invocation CLI, ne concerne généralement pas les serveurs 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'
(peut contenir des données corrompues)
'PHP_SELF'
(peut contenir des données corrompues)
'PATH_TRANSLATED'
- toute autre
'HTTP_'
valeur
§ Peut être considéré comme fiable tant que le serveur Web n'autorise que certaines méthodes de demande.
‖ Peut être considéré comme fiable si l'authentification est entièrement gérée par le serveur Web.
Le superglobal $_SERVER
comprend également plusieurs variables d'environnement. Le fait qu'ils soient «sûrs» ou non dépend de la manière (et du lieu) qu'ils sont définis. Ils peuvent aller de complètement contrôlés par le serveur à complètement contrôlés par l'utilisateur.