Il n'y a pas de valeurs "sûres" ou "non sûres" en tant que telles. Il n'y a que des valeurs contrôlées par le serveur et des valeurs contrôlées par l'utilisateur. Vous devez être conscient de l'origine d'une valeur et donc savoir si elle peut être fiable dans un certain but. $_SERVER['HTTP_FOOBAR']
par exemple, peut être stocké en toute sécurité dans une base de données, mais je ne voudrais certainement pas eval
il.
À ce titre, divisons ces valeurs en trois catégories :
Serveur contrôlé
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'
Partiellement contrôlé par le serveur
Ces variables dépendent de la requête spécifique envoyée par le client, mais ne peuvent prendre qu'un nombre limité de valeurs valides, puisque toutes les valeurs invalides doivent être rejetées par le serveur web et ne pas provoquer l'invocation du script pour commencer. Ils peuvent donc être considérés comme fiable .
'HTTPS'
'REQUEST_TIME'
-
'REMOTE_ADDR'
*
-
'REMOTE_HOST'
*
-
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
-
'HTTP_HOST'
†
-
'SERVER_NAME'
†
'SCRIPT_FILENAME'
-
'SERVER_PORT'
‡
'SCRIPT_NAME'
* Le REMOTE_
sont garanties comme étant l'adresse valide du client, telle que vérifiée par une poignée de main TCP/IP. C'est 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 à laquelle vous ne pouvez rien faire.
† Si votre serveur web répond à tout demande sans tenir compte de HOST
l'en-tête, cela doit être considéré comme peu sûr également. Voir Quelle est la sécurité de $_SERVER["HTTP_HOST"] ? .
Voir aussi 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 entièrement arbitraires contrôlées par l'utilisateur
Ces valeurs ne sont pas vérifiées du tout et ne dépendent d'aucune configuration du serveur, ce sont des informations entièrement arbitraires envoyées par le client.
-
'argv'
, 'argc'
(uniquement applicable à l'invocation de 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'
- tout autre
'HTTP_'
valeur
§ Peut être considéré fiable tant que le serveur web n'autorise que certaines méthodes de requête.
‖ Peut être considéré 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'elles soient "sûres" ou non dépend de la manière (et de l'endroit) dont elles sont définies. Elles peuvent aller du contrôle total du serveur au contrôle total de l'utilisateur.