Include sécurité ?

ViPHP
ViPHP | 2291 Messages

23 août 2007, 11:17

Bonjour,

J'ai lue un tuto sur le site du zéro qui montre comment n'inclure que des pages autoriser, j'ai adapter le code à mes besoins comme ceci.
<?php
           // Tableau contenant les pages autorisées
  // ----------------------------------------------------
  $page_site_ok = array('News'            => 'news.php',
                        'Accueil'         => 'accueil.php',
                        'Contact'         => 'contact.php'
                        );

  // On teste que le paramètre d'url existe et qu'il est bien autorisé
  // -----------------------------------------------------------------

  if ( (isset($_GET['page'])) && (isset($page_site_ok[$_GET['page']])) ) {

    include($page_site_ok[$_GET['page']]);   // On appel le contenu central de la page

  } else {

    // Page par défaut quant une page n'existe pas dans le tableau
    include('accueil.php');
  }
           ?>
Mais quand je fait une vérification de mon code dans ZEND il me dit que c'est pas sécurisé :?: quelqu'un pourrait t'il m'expliquer :wink:


D'avance merci
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

ViPHP
ViPHP | 2287 Messages

23 août 2007, 11:22

Bonjour,

J'ai lue un tuto sur le site du zéro qui montre comment n'inclure que des pages autoriser, j'ai adapter le code à mes besoins comme ceci.
<?php
           // Tableau contenant les pages autorisées
  // ----------------------------------------------------
  $page_site_ok = array('News'            => 'news.php',
                        'Accueil'         => 'accueil.php',
                        'Contact'         => 'contact.php'
                        );

  // On teste que le paramètre d'url existe et qu'il est bien autorisé
  // -----------------------------------------------------------------

  if ( (isset($_GET['page'])) && (isset($page_site_ok[$_GET['page']])) ) {

    include($page_site_ok[$_GET['page']]);   // On appel le contenu central de la page

  } else {

    // Page par défaut quant une page n'existe pas dans le tableau
    include('accueil.php');
  }
           ?>
Mais quand je fait une vérification de mon code dans ZEND il me dit que c'est pas sécurisé :?: quelqu'un pourrait t'il m'expliquer :wink:


D'avance merci
Zend se trompe sur ce coup-là et on ne peut pas trop le blâmer. Zend se contente de voir que tu utilises une variable d'entrée non-protégée ($_GET['page']) en paramètre d'un include() et en déduit que ton script n'est pas sécurisé. Il ne comprend pas que si la variable est utilisée de cette façon (en index pour accéder à une valeur d'un tableau dont les toutes les valeurs sont connues et constantes) tout est ok ;-)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 août 2007, 11:23

Il y a tellement de façon différentes de programmer, que je doute que Zend soit capable de savoir si ton code est sur ou non. Tout ce qu'il peut faire, c'est se référer à des modèles, et je suppose que comme tu utilises un $_GET dans un include(), il panique sans se préoccuper du fait qu'il s'agisse en réalité de l'index d'une white list...

Maintenant je ne connais pas zend, je me trompe peut être, mais pour moi, y a rien à changer à ton code, du moins coté sécurité :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 2291 Messages

23 août 2007, 11:28

Ok merci je croyais encore une fois avoir mal compris :wink:
y a rien à changer à ton code, du moins coté sécurité :)
Cela veut dire que je devrais changer autre chose :?: :?
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 août 2007, 11:47

Nonon, pas nécessairement, tout dépend de ta façon de programmer :) Personnellement je trouve par exemple que tu surcharges un peu trop de parenthèses inutiles et préfère des codes plus légers :
if ( (isset($_GET['page'])) && (isset($page_site_ok[$_GET['page']])) ) { 

if ( isset($_GET['page']) && isset($page_site_ok[$_GET['page']]) ) { 
Mais surtout je ne suis pas fan des pseudos frames, et encore moins de devoir venir compléter un tableau à chaque fois que je veux ajouter une nouvelle page... Du coup, quitte à devoir faire des pseudo frames, je me contente de tester que le fichier demandé existe en local (is_file('./' . $_GET)) pour éviter l'ouverture d'un script distant, et que le chemin spécifié ne contient pas de '../' pour éviter qu'on n'ouvre un autre répertoire que celui que j'autorise :)

Ca demande un peu plus d'attention pour la sécurité, mais au moins ensuite, je ne me prend plus la tête à déclarer chaque nouvelle page, chaque réorganisation de dossier, ou chaque renommage :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 2291 Messages

23 août 2007, 12:00

Nonon, pas nécessairement, tout dépend de ta façon de programmer :) Personnellement je trouve par exemple que tu surcharges un peu trop de parenthèses inutiles et préfère des codes plus légers :
if ( (isset($_GET['page'])) && (isset($page_site_ok[$_GET['page']])) ) { 

if ( isset($_GET['page']) && isset($page_site_ok[$_GET['page']]) ) { 
Effectivement tu a rason :wink: comme toujours
Mais surtout je ne suis pas fan des pseudos frames, et encore moins de devoir venir compléter un tableau à chaque fois que je veux ajouter une nouvelle page... Du coup, quitte à devoir faire des pseudo frames, je me contente de tester que le fichier demandé existe en local (is_file('./' . $_GET)) pour éviter l'ouverture d'un script distant, et que le chemin spécifié ne contient pas de '../' pour éviter qu'on n'ouvre un autre répertoire que celui que j'autorise :)
J'avais hésité entre les deux méthodes je me tâte encore . :wink:

Merci à vous deux :!:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.