Journal du Net > Développeurs > Contributions > Soumettez votre meilleure astuce PHP

APPEL
A CONTRIBUTION

Vous manipulez le langage PHP au quotidien pour concevoir votre site Web ? Vous avez certainement une astuce à partager !

Participez

 is_in_base_dir  

Laurent Dinclaux , Païta - Nouvelle-Calédonie

Quel est en 3 lignes l'objectif de votre astuce ?

Mieux sécuriser l'inclusion de fichier lorsqu'un chemin peut ne pas être sûr.

Décrivez votre astuce en détail. N'hésitez-pas à inclure des portions de codes.

Il arrive souvent que l'ont veuille recevoir des chemins ou un nom de fichier par POST ou GET.
Comme vous le savez surement déjà il est fortement déconseillé de faire un "include($_POST['path']);" ou un "echo file_get_contents($_POST['path']);"

En effet ce 'path' peut être bidouillé par un internaute en quelque chose du genre: '../../../etc/passwd' ce qui provoque un réel problème de sécurité...

Pour pallier a cela, j'ai créé une petite fonction qui permet de vérifier que le fichier à inclure est bien dans un chemin définit:

function is_in_base_dir($filePath, $baseDir) {

$_filePath = realpath($filePath);
if(!$_filePath) throw new Exception('Le fichier ' . $filePath . ' n'existe pas. ');

if( strpos($_filePath, $baseDir) === 0 ) return true;
else return false;

}

L'utilisation est simple:

if( is_in_base_dir($_POST['path'], '/var/www/monsite/include') ) {
include($_POST['path']);
}

Vous serez dans ce cas certain que le chemin reçu en $_POST pointe effectivement vers un fichier situé dans /var/www/monsite/include ou vers ses sous-répertoire.

Cela peut aussi être aussi utile pour le redimenssionnement d'images à la volée avec GD ou le chemin vers l'image est transmis à un script ex: resize.php?i=photos/test.jpg.


Publié le 14 mars 2007

  Les dernières contributions  

  En ce moment sur Journal du Net Développeur  
16 contributions : 1 ... 4 5 6 7 8 9 10 11 12 13 14 15 16
 




 

RECHERCHE