Problème de sécurité avec include

Petit nouveau ! | 3 Messages

17 juil. 2006, 08:08

Bonjour à tous,

j'ai crée un petit site personnel, mais le code php n'est absolument pas sécurisé, mes quelques notions de php sont trop faible pour déterminer comment sécuriser ce code pour éviter le piratage, mon site n'a pas de prétentions particulieres, juste quelques articles à lire, pas plus d'une centaine

j'utilise des pseudo-frames pour éviter de faire un tableau
ce qui donne une URL de ce type :

Code : Tout sélectionner

http://mon_site.fr/frames2.php?page=service3
Hormis des includes, je n'utilise rien d'autre, pas de javascript, pas de session

J'ai lu avec beaucoup d'intérêt les page concernant la sécurité sur
http://www.phpsecure.info
mais j'ai du mal à m'y retrouver pour faire quelque chose de cohérent

alors voici mon code de la page index.php :
<div class="head">
<? include ("haut.php");// mon header 
?>
</div>

<div class="gauche">
<? include ("gauche.php"); // mon menu de gauche 
?>
</div>

<div class="frame">
<? include ("centre.php"); // les pages du centre 
?>
</div>
voici la partie frames2.php :
<? include ("haut.php");?>

<div class="gauche">
<? include ("gauche.php");?>
</div>
<div class="frame">

<?php 

if (!isset($_GET['page'])) $page= 'accueil'; else $page= $_GET['page']; 
 switch($page)
{
case 'service':include ('ser/service.php');break;
case 'service1':include ('ser/service1.php');break;
case 'service2':include ('ser/service2.php');break;
case 'service3':include ('ser/service3.php');break;
case 'service4':include ('ser/service4.php');break; 
case 'service5':include ('ser/service5.php');break; 
case 'service6':include ('ser/service6.php');break; 
case 'service7':include ('ser/service7.php');break; 

/* avec encore plein de lignes identiques , toutes mes pages sont dans
 un dossier qui contient 3 lettres , exemple : img/ ou ser/ 
et ensuite, les fichiers numérotés de 1 à 15 en fonction des articles
*/
} 
?>

</div>
j'ai lu qu'il fallait ajouter quelques lignes pour ne passer que des fichiers en php
$page = $page.".php"; // Ajout d'une extension .php
  if(file_exists($page))
  include($page);
  else
  include("erreur404.php"); 
j'ai également lu que c'était possible d'interdire des redirections en utilisant des caractères interdits
$page=preg_replace("/[^a-z0-9_ ]/i", "", $page);
if(!@include("includes/$page.php"))die("Cette page n'existe pas sur le serveur.");
/* ou alors un autre exemple */
 $page = ereg_replace("/","subk"); // Modification de '/' par 'subk'
$page = ereg_replace("%2f","subk); // Idem mais avec l'equivalent unicode de / (%2f)

Voila, mais je ne sais pas vraiment comment faire pour incorporer ses lignes dans mon script et quelles sont celles qui sont valables pour sécuriser mon code,

d'avance je vous remercie de m'avoir lu, et si possible de m'expliquer clairement ce que j'ai du mal à comprendre !
Modifié en dernier par speeder le 18 juil. 2006, 05:01, modifié 1 fois.

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

17 juil. 2006, 10:07

En l'état, cette partie de ton script est sécurisée (l'inclusion de page php).

Le piratage de ce côté de ton script consisterait pour le visiteur à modifier la valeur ?page=XXX dans l'adresse pour inclure une page non prévue par ton programme. Tu as déjà mis un switch/case qui te garantit que quelque soit la valeur inscrite par le visiteur dans $_GET['page'], il ne pourra pas inclure une page différente de celles que tu as prévues.

Tu peux éventuellement simplifier ton script grâce à un tableau :
$pages = array(
'accueil'  => 'home',
'erreur'   => 'erreur',
'service'  => 'ser/service',
'service1' => 'ser/service1',
...
);

// $page = valeur passée par l'url, "accueil" par défaut
$page = isset($_GET['page']) ? $_GET['page'] : 'accueil';

// $page = une page autorisée, "erreur" par défaut
if (!isset($pages[$page])) $page = 'erreur';

// insertion de la page prévue
inclure "{$pages[$page]}.php";
ça reste tout à fait équivalent, juste un peu plus facile à maintenir pour toi et moins sujet à l'ajout d'une erreur de syntaxe lors de l'insertion d'une nouvelle page.
Modifié en dernier par naholyr le 17 juil. 2006, 14:15, modifié 1 fois.

ViPHP
fab
ViPHP | 2657 Messages

17 juil. 2006, 14:01

si il n'y a pas de default dans le switch le code n'est pas sécurisé en PHP5 voir mem peut eter dans les derniers version de PHP4
[$page = $page.".php"; // Ajout d'une extension .php
  if(file_exists($page))
  include($page);
  else
  include("erreur404.php");
un file_exists peut marcher a distance ainsi un page du type $page=http://[domain]/file_to_hack marchera très bien puisque l'extension est rajouté dans le code :) et il sera meme éxécuté ( principe du include )[/img]
Modifié en dernier par fab le 17 juil. 2006, 22:32, modifié 1 fois.
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Petit nouveau ! | 3 Messages

17 juil. 2006, 18:29

merci pour vos réponses,

donc, j'en conclu que le code n'est pas sécurisé,

mais quelles sont les solutions pour le sécuriser ?


si possible en m'indiquant ou mettre le code dans mon script
() si vous avez besoin d'autres renseignements pas de soucis :)

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

17 juil. 2006, 20:58

La solution des arrays est sécurisée, ou encore ta solution mais en terminant le switch par un "default : include 'page_par_defaut.php'" pour être sûr de prévoir tous les cas.

ViPHP
fab
ViPHP | 2657 Messages

17 juil. 2006, 22:32

un petit résolu fait pas de mal =]
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Petit nouveau ! | 3 Messages

18 juil. 2006, 05:00

ok,

je vous remercie, je vais faire le necessaire ;)