# Programmation PHP/Variables superglobales

* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
[ Modifier le sommaire ]

## Les variables superglobales

Ces variables sont prédéfinies à PHP et sont destinées à stocker des informations bien spécifiques. Elles se présentent généralement sous la forme d'un tableau associatif à une ou deux dimensions. Elles sont disponibles dans tous les contextes d'exécution (fonctions ou méthodes).
Voici une liste non-exhaustive (comprenant les cas d'utilisation les plus courants) :

### Variables de serveur : $_SERVER

Elle contient des informations sur le serveur (nom, IP, logiciels installés…)
Par exemple pour extraire l'URL de la page courante :

#### Références

* « Extraire l’url de la page en cours » [html]
* (en) « $_SERVER » [html]

### Variables d'environnement : $_ENV

Elle contient des informations sur l'environnement d'exécution du script PHP (c'est-à-dire sur le serveur). Elle est donc directement liée au serveur et à son système.
Prenons comme exemple, le prénom 'Paul' :
En imaginant que l'utilisateur 'Paul' exécute ce script, on aura alors :
* Exemple
* Mon nom d'utilisateur est Paul !

### Cookies : $_COOKIE

Elle stocke les informations sur les cookies envoyés aux clients.
Un petit exemple pour illustre cela :
On suppose que le cookie "name" a été défini précédemment, (on prendra Paul encore une fois)
L'exemple ci-dessus va afficher alors :
* Exemple
* Bonjour Paul !

### GET variables : $_GET

Elle stocke les valeurs des arguments passés par URL. Ses clés sont donc par conséquent variables. Pour illustrer ces propos, imaginons que l'utilisateur ai entrée l'URL suivant : http://example.com/?name=Paul
L'exemple ci-dessus va afficher alors :
* Exemple
* Bonjour Paul !

### POST variables : $_POST

Elle stocke les valeurs des informations passées par formulaire avec la méthode="post". Ses clés sont donc par conséquent variables.
L'exemple ci dessous est un formulaire comportant un champ de saisie et un bouton de soumission.
Quand un utilisateur soumet des données en cliquant sur "Soumettre", les données du formulaire sont envoyées dans un fichier spécial dans l'attribut d'action de la balise <form>.
Puis, on peut utiliser $_POST pour recueillir la valeur du champ de saisie.
* Exemple
* <html>
* <body>
* <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
* Nom : <input type="text" nom="fnom">
* <input type="soumettre">
* </form>
* <?php
* if ($_SERVER["REQUEST_METHOD"] == "POST") {
* // collecte la valeur du champ de saisie
* $nom = $_REQUEST['fnom'];
* if (empty($nom)) {
* echo "Le nom est vide";
* } else {
* echo $nom;
* </body>
* </html>

### Variables de requête : $_REQUEST

Un tableau associatif constitué du contenu des variables $_GET, $_POST, $_COOKIE.
L'exemple ci dessous est un formulaire comportant un champ de saisie et un bouton de soumission.
Quand un utilisateur soumet des données en cliquant sur "Soumettre", les données du formulaire sont envoyées dans un fichier spécial dans l'attribut d'action de la balise <form>.
Puis, on peut utiliser $_REQUEST pour recueillir la valeur du champ de saisie.
* Exemple
* <html>
* <body>
* <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
* Nom : <input type="text" nom="fnom">
* <input type="soumettre">
* </form>
* <?php
* if ($_SERVER["REQUEST_METHOD"] == "POST") {
* // collecte la valeur du champ de saisie
* $nom = $_REQUEST['fnom'];
* if (empty($nom)) {
* echo "Le nom est vide";
* } else {
* echo $nom;
* </body>
* </html>

### Variable de téléchargement : $_FILES

Elle stocke les informations sur un fichier envoyé via HTTP par le client par un formulaire.

### Variables de session : $_SESSION

Elle contient les valeurs de la session en cours pour le client.

### Variables globales : $GLOBALS

Elle stocke les variables globales de la page. Ses clés sont donc variables.
Ci-dessous, un exemple d'utilisation de la variable $GLOBALS.
* Exemple
* <?php
* $x = 75;
* $y = 25;
* function addition
* $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
* addition;
* echo $z;
Lorsqu'on exécute ce code, on obtient "100" (=> résultat de la variable 'z' + 'y').

## filter_input

Une bonne pratique consiste à filtrer les contenus des variables superglobales, qui sont vulnérables aux injections de code.
Pour des raisons de sécurité, on évitera donc d'appeler directement les tableaux des variables superglobales comme dans les paragraphes précédents, pour leur préférer la syntaxe filter_input :
Ne pas confondre avec la fonction filter_var qui permet d'appliquer des validations ou nettoyages de certaines données (ex : email, URL, adresse IP, booléen...).

## Références

* ↑ https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet#Untrusted_data
* ↑ http://php.net/manual/fr/function.filter-input.php
* ↑ http://php.net/manual/fr/filter.filters.validate.php