Problème de sécurité avec include

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème de sécurité avec include

par speeder » 18 juil. 2006, 05:00

ok,

je vous remercie, je vais faire le necessaire ;)

par fab » 17 juil. 2006, 22:32

un petit résolu fait pas de mal =]

par naholyr » 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.

par speeder » 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 :)

par fab » 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]

par naholyr » 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.

Problème de sécurité avec include

par speeder » 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 !