Page 1 sur 1
Faille dans Include
Posté : 01 janv. 2007, 13:50
par Au secours
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
Posté : 01 janv. 2007, 14:24
par jojolapine
Posté : 01 janv. 2007, 14:28
par Cyrano
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.
Posté : 01 janv. 2007, 14:50
par AB
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)
Posté : 01 janv. 2007, 14:55
par Au secours
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 ?
Posté : 01 janv. 2007, 14:57
par Truc
ça peut être bon...
Sinon regarde
cet exemple.
Posté : 01 janv. 2007, 15:06
par Au secours
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é

Posté : 01 janv. 2007, 15:22
par AB
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é.
Posté : 01 janv. 2007, 15:26
par Au secours
Ok merci pour l'info.
Par contre

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.
Posté : 01 janv. 2007, 15:39
par Truc
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
// ...
?>
Posté : 01 janv. 2007, 15:41
par Cyrano
As-tu suivi les différents liens ? As-tu vu
celui-ci ?
Posté : 01 janv. 2007, 15:44
par AB
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é