96 votes

Quelles variables $_SERVER sont sûres ?

Toute variable qu'un utilisateur peut contrôler, un attaquant peut également la contrôler et est donc une source d'attaque. C'est ce qu'on appelle une variable "altérée", et elle n'est pas sûre.

Lorsque vous utilisez $_SERVER la plupart des variables peuvent être contrôlées. PHP_SELF , HTTP_USER_AGENT , HTTP_X_FORWARDED_FOR , HTTP_ACCEPT_LANGUAGE et bien d'autres font partie de l'en-tête de la requête HTTP envoyée par le client.

Est-ce que quelqu'un connaît une "liste sûre" ou une liste non contaminée de $_SERVER des variables ?

144voto

deceze Points 200115

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.

12voto

Reiners Points 71

En PHP, chaque $_SERVER variable commençant par HTTP_ peut être influencée par l'utilisateur. Par exemple, la variable $_SERVER['HTTP_REINERS'] peut être altéré en mettant l'en-tête HTTP REINERS à une valeur arbitraire dans la requête HTTP.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X