Faille dans Include

Au secours
Invité n'ayant pas de compte PHPfrance

01 janv. 2007, 13:50

Bonjour à tous
Je n'arrete pas de me faire piraté mon site par le meme pirate et la il ma mis un message violent ; en gros si je remets le site sur pied il détruit tout!

Voici le code que j'ai mis sur Pages.php :
<?php include ($_GET['id'] . ".php");?>

Comment faire pour sécuriser cette page d'une facon simple ?
Merci à tous et bonne année

ViPHP
ViPHP | 3607 Messages

01 janv. 2007, 14:24


Mammouth du PHP | 19672 Messages

01 janv. 2007, 14:28

Il est très dangereux de faire un include() de données utilisateur sans les valider au préalable : or une donnée issue de l'url via $_GET vient de l'utilisateur et peut donc être modifiée par cet utilisateur : faire directement un include() t'expose à ce que tu as subi : une injection de code.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
AB
ViPHP | 5818 Messages

01 janv. 2007, 14:50

Ta variable $_GET['id'] représente quoi? une page de ton site que tu veux inclure?

si oui on peut faire quelque chose comme

$page = isset($_GET['page'])? intval($_GET['page']) : 0 ;

function inclure($page) {
switch ($page) {
case "0" : $page = 'accueil.html'; break;
case "1" : $page = 'deuxiemepage.html'; break;
case "2" : $page = 'troisiemepage.html'; break;
etc...
}
return ($page);
}

et
<?php $includepage = (file_exists(inclure($page)))? inclure($page) : 'accueil.html';
include("$includepage"); ?>

Avec cette méthode, <a href="?page=1">lien</a> incluera 'deuxiemepage.html'

D'une manière générale il faut absolument vérifier une variable insérée dans un include. Car sinon un pirate même débutant peut envoyer dans la barre d'adresse : adressedetonsite?id=adressedemapagepirate
et donc include (adressedemapagepirate)
Modifié en dernier par AB le 01 janv. 2007, 15:04, modifié 1 fois.

Au secours
Invité n'ayant pas de compte PHPfrance

01 janv. 2007, 14:55

J'ai modifié le code en ca :

Code : Tout sélectionner

<?php if(isset($_GET['id']) && file_exists($_GET['id'].'.php')) { include $_GET['id'].'.php'; } else { include '404.php'; } ?>
Ca peut être bon ?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

01 janv. 2007, 14:57

ça peut être bon...

Sinon regarde cet exemple.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Au secours
Invité n'ayant pas de compte PHPfrance

01 janv. 2007, 15:06

Ouh la c'est compliqué pour moi Lol
Egalement on ma dit qu'il fallait mettre allow_url_fopen sur OFF chez OVH mais je n'arrive pas à trouver mon php.ini

J'espère que je ne vais plus me faire piraté :cry:

ViPHP
AB
ViPHP | 5818 Messages

01 janv. 2007, 15:22

Etant donné que file_exists ne fonctionne pas sur les fichiers distants, normalement ça devrait suffire.

Mais bon, comme je ne connais pas toutes les ficelles des pirates, je préfère blinder pour être sûr.

Donc je te conseilles de commencer avec ta correction dans un premier temps, et quand tu auras un peu plus de temps d'appliquer l'une des méthodes que l'on t'a indiqué.

Au secours
Invité n'ayant pas de compte PHPfrance

01 janv. 2007, 15:26

Ok merci pour l'info.
Par contre :oops: vous serez t'il possible de me faire le début du code pour la protection et je continuerai moi même.
Mes pages sont dans le dossier Pages/

Exemple avec la page Logos.php

Comment dois je procéder ?
Merci à tous.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

01 janv. 2007, 15:39

En partant de l'exemple du lien donné avec un peu plus de commentaires :
<?php

// configuration des pages acceptées
//ici toutes les pages (nom des fichiers, sous forme de tableau) qui peuvent être affichées

$pages = array(
  'accueil' => 'accueil',
  'recep' => 'reception',
  'envoi' => 'envoi',
  'ecrire' => 'ecrire'
);

// page par défaut
$page_par_defaut = 'accueil';

// pré-exécution commune à tout le site
// ...

// inclure la bonne page
//test de l'existence de la variable de l'URL ("page")
$page = isset($_GET['page']) ? $_GET['page'] : $page_par_defaut;

//on vérifie si la variable passée dans l'url est une des pages exécutables
$script = isset($pages[$page]) ? $pages[$page] : $pages[$page_par_defaut];

//inclure la page autorisée
include 'pages/' . $script . '.php';

// post-exécution commune à tout le site
// ...

?> 

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 19672 Messages

01 janv. 2007, 15:41

As-tu suivi les différents liens ? As-tu vu celui-ci ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
AB
ViPHP | 5818 Messages

01 janv. 2007, 15:44

Avec la méthode que j'ai indiqué plus haut, il n'y a qu'à ajouter des cases
dans la fonction inclure($page) ex
function inclure($page) { 
switch ($page) { 
case "0" : $page = 'Pages/tapagepardéfaut.php'; break; 
case "1" : $page = 'Pages/Logos.php'; break; 
case "2" : $page = 'etc..'; break; 
} 
return ($page); 
} 
et pour appeler les pages: tonsite?page=1
chargera ta page logo sans ambiguité