Né en 1994 comme une petite boîte à outils pour une page personnelle, PHP fabrique aujourd'hui une grande partie des pages du Web, de WordPress à Wikipédia. Cinq planches pour comprendre comment il travaille, côté serveur, jusqu'à un petit interpréteur PHP qui tourne dans cette page et dont chaque exemple a été vérifié contre le vrai PHP 8.3.
En 1994, le programmeur dano-canadien Rasmus Lerdorf écrit quelques programmes pour suivre les visites de son CV en ligne : les Personal Home Page Tools. Il les publie en 1995 ; l'idée plaît, et en 1997-1998 deux étudiants israéliens, Andi Gutmans et Zeev Suraski, réécrivent le cœur du langage, rebaptisé PHP : Hypertext Preprocessor. Son principe est simple : on écrit une page HTML dans laquelle on glisse des instructions entre <?php et ?>. Le serveur exécute ces instructions et n'envoie au navigateur que le HTML produit ; le visiteur ne voit jamais le code PHP.
Le navigateur envoie une requête HTTP au serveur, avec éventuellement des paramètres dans l'adresse (après le ?). Le serveur web confie le fichier .php à l'interpréteur PHP, qui l'exécute de haut en bas : le HTML est recopié tel quel, les morceaux PHP sont remplacés par ce qu'ils affichent. La page fabriquée revient au navigateur dans la réponse HTTP. Choisissez les paramètres puis envoyez la requête.
htmlspecialchars : avec le prénom « <b>Pirate</b> », les chevrons sont transformés en < et > et s'affichent au lieu d'être interprétés. Sans cette précaution, un visiteur pourrait glisser son propre code dans la page (planche 3).En PHP, un seul type, le array, sert à la fois de liste et de dictionnaire : $capitale['France'] = 'Paris'. Pour retrouver très vite une clé, PHP la transforme en nombre par une fonction de hachage, puis range l'élément dans le compartiment (en anglais bucket) désigné par ce nombre. Pour les clés de texte, PHP utilise la fonction DJBX33A de Daniel J. Bernstein : partir de 5381, puis pour chaque caractère multiplier par 33 et ajouter son code. En plus, PHP garde les éléments dans l'ordre où on les a ajoutés : c'est l'ordre que suit foreach.
—
max_input_vars).Une page PHP reçoit des textes tapés par n'importe qui. Le danger survient quand ces textes sont collés dans du code : une requête SQL envoyée à la base de données, ou une page HTML envoyée au navigateur. Un visiteur malveillant peut alors écrire un texte qui change le sens du code. Ce sont les deux failles les plus célèbres du Web : l'injection SQL et le XSS (cross-site scripting).
Un formulaire de connexion vérifie le nom et le mot de passe en interrogeant la table utilisateurs. Tapez des identifiants, ou essayez les attaques proposées.
$sql = "SELECT * FROM utilisateurs
WHERE nom = '" . $_POST['nom'] . "'
AND mdp = '" . $_POST['mdp'] . "'";
$res = $db->query($sql);
$st = $db->prepare("SELECT * FROM utilisateurs
WHERE nom = ? AND mdp = ?");
$st->execute([$_POST['nom'], $_POST['mdp']]);
La table utilisateurs. Les lignes surlignées sont celles que renvoie la requête naïve. (Dans une vraie application, les mots de passe ne sont jamais stockés en clair, mais sous forme d'empreinte calculée par password_hash.)
Un livre d'or affiche les messages des visiteurs. Écrivez un message contenant des balises HTML.
echo $message;echo htmlspecialchars($message);admin' --, l'apostrophe ferme la chaîne et -- transforme la suite en commentaire : la vérification du mot de passe disparaît, et l'on entre sans le connaître. Avec ' OR '1'='1, la condition devient toujours vraie et la base renvoie tous les utilisateurs. La requête préparée envoie le code SQL et les valeurs séparément : quoi que tape le visiteur, cela reste une valeur, jamais du code. Même règle pour le HTML : htmlspecialchars transforme < en <, et la balise s'affiche au lieu de s'exécuter. Ces deux réflexes, apparus tardivement dans l'histoire de PHP (PDO et ses requêtes préparées datent de PHP 5.1, en 2005), font partie de toute formation sérieuse au développement web.HTTP ne garde aucun souvenir : chaque requête arrive comme si c'était la première. Pour qu'un site se rappelle votre panier, PHP utilise les sessions. Au premier passage, session_start() tire au hasard un long identifiant, l'envoie au navigateur dans un cookie nommé PHPSESSID, et ouvre côté serveur un petit fichier à ce nom. À chaque requête suivante, le navigateur renvoie le cookie, et PHP recharge le contenu du fichier dans le tableau $_SESSION.
Cookie voyage avec chaque requête.L'identifiant compte 32 caractères hexadécimaux, soit 32 × 4 = 128 bits tirés au hasard (le réglage par défaut de PHP).
HttpOnly (illisible par JavaScript) et Secure (envoyé seulement en HTTPS).Cette page contient un interpréteur PHP écrit en JavaScript : il lit votre programme, le découpe en jetons, construit son arbre syntaxique et l'exécute. Il reproduit les règles de PHP 8 sur un large sous-ensemble du langage : variables, chaînes avec interpolation, tableaux associatifs, boucles, fonctions, fonctions fléchées, match, mélange de HTML et de PHP, et une centaine de fonctions prédéfinies. Chaque exemple a été exécuté par le vrai PHP 8.3 au moment de la fabrication de cette page : la sortie de référence est enregistrée et comparée en direct, caractère par caractère.
"5" + 3 vaut 8 mais "5" . 3 vaut "53", et echo affiche 0.1 + 0.2 comme 0.3 alors que la valeur stockée est 0.30000000000000004. PHP 8 a corrigé plusieurs de ces pièges ("abc" == 0 est désormais faux) et ajouté des types déclarés, comme dans la fonction factorielle(int $n): int. Le vrai PHP compile d'abord le programme en instructions pour sa machine virtuelle (la Zend Engine) et, depuis PHP 8.0, peut même traduire les parties les plus utilisées en code machine (le compilateur JIT). Modifiez les exemples : l'interpréteur signale les erreurs comme PHP, mais il ne gère ni les objets ni les fichiers.WordPress (2003), Drupal, Joomla : les gestionnaires de contenu en PHP font fonctionner une grande partie des sites, des blogs personnels aux sites de journaux et d'institutions.
Wikipédia repose sur MediaWiki, écrit en PHP. Facebook a commencé en PHP en 2004 et a ensuite créé son propre dialecte, Hack, et sa machine virtuelle HHVM.
PrestaShop (créé à Paris en 2007), WooCommerce, Magento : des boutiques entières, paniers, paiements et stocks, sont écrites en PHP.
Les cadriciels Symfony (créé en France par SensioLabs en 2005) et Laravel (2011) servent à bâtir des applications complètes : intranets, plateformes de formation comme Moodle.
L'interpréteur de la planche 5 est une imitation pédagogique : il calcule sur les nombres comme PHP (entiers et nombres à virgule distincts, affichage à 14 chiffres significatifs), mais ses entiers sont limités à 2⁵³ et il ne connaît pas les objets. Les tables de hachage de la planche 2 sont simplifiées : PHP utilise la même fonction de hachage, mais une organisation de mémoire plus compacte.