PHP : $_SERVER[‘SCRIPT_NAME’] vs $_SERVER[‘REQUEST_URI’]

Les variables d'environnement de PHP nous offrent toute l'information nécessaire pour connaître le nom de la page Web actuellement affichée. Ceci sera pratique si on doit faire un traitement particulier lorsqu'on est sur la page d'accueil ou encore sur la page de demande d'information. Ceci permettra également d'utiliser du code commun à toutes les pages mais qui permet une personnalisation selon la page affichée. 

▼Publicité

Si on sait retrouver le nom de la page Web par programmation, il sera également plus facile de maintenir les pages affichant un formulaire dont le bouton de soumission doit mener vers la même page Web.

SCRIPT_NAME vs REQUEST_URI vs PHP_SELF

La variable $_SERVER, qui est en fait un tableau, offre plusieurs éléments permettant de retrouver le nom de la page actuelle.

Chacun comprend des avantages et des inconvénients.

URL entré dans le navigateur PHP_SELF  SCRIPT_NAME  REQUEST_URI 
http://mondomaine.com/monsite/index.php /monsite/index.php /monsite/index.php /monsite/index.php
http://mondomaine.com/monsite/  /monsite/index.php /monsite/index.php /monsite/
http://mondomaine.com/monsite/index.php&id=3 /monsite/index.php /monsite/index.php /monsite/index.php?id=3
http://mondomaine.com/monsite/index.php/test/ /monsite/index.php/test/ /monsite/index.php /monsite/index.php/test/

Donc, on voit que selon l'URL utilisé, l'utilisation de PHP_SELF, SCRIPT_NAME ou REQUEST_URI pourra donner des résultats différents.

À retenir :

  • Si vous avez besoin des paramètres, utilisez REQUEST_URI.
  • Mais attention : si le serveur Web envoie la page par défaut (ex : http://mondomaine.com/monsite/ ), il faudra plutôt utiliser SCRIPT_NAME pour obtenir le nom de la page.
  • PHP_SELF et SCRIPT_NAME donnent presque toujours le même résultat. Il y a exception lorsqu'on entre un dossier après le nom de la page Web. On préférera l'utilisation de SCRIPT_NAME puisque les caractères suivant le nom de la page avec PHP_SELF peuvent ouvrir un trou de sécurité.

Extraire le nom de la page Web

Plusieurs sites Web utilisent une base de données pour stocker de l'information sur les pages à afficher : titre h1, texte de la page, etc. Pour retrouver l'information à utiliser, il faudra extraire le nom de la page (ex : index.php) de la valeur retournée par la variable d'environnement.

La fonction php basename() permet d'extraire la dernière information du chemin retourné. Et comme les paramètres dans l'URL ne sont pas utiles lorsqu'on ne cherche que le nom de la page Web, l'utilisation de SCRIPT_NAME est toute indiquée.

Ex :

PHP

echo basename($_SERVER['SCRIPT_NAME']);   // affiche index.php

Protéger notre code lors de l'utilisation de $_SERVER['REQUEST_URI']

Si vous utilisez REQUEST_URI aveuglément dans vos scripts, vous vous exposez aux attaques XSS. En effet, un usager malveillant pourrait entrer des paramètres dans l'URL et ces paramètres pourraient être interprétés contre votre gré.

Voici une démonstration1 :

Soit un usager malveillant qui entre ceci dans la barre d'adresse du navigateur :

URL

http://mondomaine.com/index.php/%22%3E%3Cscript%3Ealert('Cassé !')%3C/script%3E

On a mis en évidence certains caractères avec un code de couleur :

URL

http://mondomaine.com/index.php/%22%3E%3Cscript%3Ealert('Cassé !')%3C/script%3E

où :

  • %22 est un guillemet 
  • %3E est un >
  • %3C est un <

Si cette page contient la balise suivante :

PHP

<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">

Une fois le code PHP exécuté, cette balise donnera :

HTML

<form method="post" action="index.php/"><script>alert('Cassé !')></script>">

Voici la même balise avec un  code de couleur faisant le lien entre le caractère interprété et le code original :

HTML

<form method="post" action="index.php/"><script>alert('Cassé !')</script>">

Ainsi, lorsque la page sera affichée, la balise <script> sera interprétée et un popup apparaîtra à l'écran. Ceci n'est rien de très menaçant mais cet exemple illustre comment un usager malveillant peut exécuter un script potentiellement dangereux par la simple utilisation de $_SERVER['REQUEST_URI'].

Pour se protéger, on utilisera plutôt l'instruction suivante :

PHP

<form method="post" action="<?php echo htmlspecialchars($_SERVER["REQUEST_URI"]); ?>">

Cette fois, l'utilisation de htmlspecialchars() assure que les caractères potentiellement dangereux soient convertis dans leur équivalent HTML. Donc, < deviendra &lt; et > deviendra &gt;. Le navigateur ne pourra pas interpréter ce bloc de code comme une balise <script>.

Notez que les mêmes précautions s'imposent si vous utilisez PHP_SELF puisqu'il est possible d'ajouter des caractères malveillants à la suite du nom de la page Web (rappel : avec l'URL http://mondomaine.com/monsite/index.php/test/, $_SERVER['PHP_SELF'] donnera /monsite/index.php/test/).

Sources

1. « PHP 5 Form Validation ».  W3Schools. http://www.w3schools.com/php/php_form_validation.asp

Pour plus d'information

« $_SERVER['PHP_SELF'] vs $_SERVER['SCRIPT_NAME'] vs $_SERVER['REQUEST_URI'] ». Raptor talk. http://raptor.hk/_serverphp_self-vs-_serverscript_name-vs-_serverrequest_uri/

« $_SERVER ». PHP. http://www.php.net/manual/en/reserved.variables.server.php

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories