Pseudo Mot de passe
fleche Inscription
fleche Mot de passe oublié ?
Informations Générales
Chargement en cours...
Nombre de Visites fleche [ 139916 ]
Votre IP fleche [ 38.103.63.16 ]
Vous êtes ici : Home Page Dossiers Trucs et astuces (PHP) Securiser PHP SELF
Imprimer Imprimer le document

Informations Membres

[195] Posts sur le forum
[177] Membres inscrits
Il y a en ligne :
  arrow 0 Membre
  arrow 2 Invités

fled Membre en ligne:
Aucun

Partenariat

Partenariat Vous pouvez aider ce site à évoluer, en contribuant à son développement. Proposez vos idées de cours et/ou dossiers. Rendez-vous dans « Partenariat » pour en savoir plus.


Nom de domaine

www.

Partenaires

PHP/MySQL - Sécuriser $_SERVER['PHP_SELF']

Auteur : Julien Pauli | Créé le : 13/10/2007 à 09H00

La variable $_SERVER['PHP_SELF'], comme vous le savez, sert souvent à nos cher formulaires. De façon à reprendre l'adresse URI dans laquelle notre formulaire va être traité.

Mais cette variable est facilement falsifiable afin d'insérer des scripts malicieux comme du javascript, afin de pirater votre système.

Voici un exemple simple de formulaire utilisant notre variable :

<form action="<?php echo $_SERVER['PHP_SELF']; ?>"> 
<input type="hidden" name="submitted" value="1" /> 
<input type="submit" value="Submit" /> 
</form> 

Si nous plaçons ce script par exemple à cette adresse
http://localhost/phpself.php
on s'attend sur un serveur configuré normalement, à avoir :

<form action="/phpself.php"> 
<input type="hidden" name="submitted" value="1" /> 
<input type="submit" value="Submit" /> 
</form> 

Et bien en fait, non.
En réalité, la variable $_SERVER['PHP_SELF'] peut être manipulée par le client, car elle contient tout ce qui se situe entre la partie du fichier appelé dans l'URI, et la rencontre du premier ? indiquant le début de la chaine de requête ( passage de paramètres ).
Ceci designe le contenu de la variable $_SERVER['PATH_INFO'], et ce contenu est ajouté à $_SERVER['PHP_SELF'].

Ainsi, si on interroge notre page via
http://localhost/phpself.php/script_ici
alors on se retrouve avec ceci :

<form action="/phpself.php/script_ici"> 
<input type="hidden" name="submitted" value="1" /> 
<input type="submit" value="Submit" /> 
</form> 

Et donc bien entendu avec
http://localhost/phpself.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cdata
on obtient une sortie comme cela :

<form action="/phpself.php/"><script>alert('xss')</script><data"> 
<input type="hidden" name="submitted" value="1" /> 
<input type="submit" value="Submit" /> 
</form> 

La partie "data" rajoutée sert à fermer le tag du formulaire, d'une manière absolument pas conventionnelle ni même valide, mais c'est de cette manière que rien ne s'affiche à l'écran, sur le navigateur.
Il y a donc exécution de code Javascript malicieux par injection, avec tout ce que ca engendre ( vol de cookie entre autre, attaque CSRF, etc... ).

Il est pourtant possible de se protéger, en inscrivant ceci :

<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>"> 
<input type="hidden" name="submitted" value="1" /> 
<input type="submit" value="Submit" /> 
</form> 

Voici notre formulaire ainsi protégé.

(0) commentaires - Voir/EditerAjout commentaire

Haut de page