Aller au contenu
Télécharger Firefox 2

Pseudo Frames en pratique : includes sécurisés

En PHP, on a souvent recours à ce qu'on appelle communément les pseudo frames. Elles permettent de gagner un temps appréciable au niveau de la maintenance et également dans le travail d'intégration. Il est fort possible d'aller plus loin et d'améliorer considérablement la maintenance, et c'est ce que nous allons voir.

Mise en situation

Rien de mieux qu'un exemple:
Essayons de mettre en place une documentation concernant quelques fonctions PHP. A chaque fonction correspondra une page dans laquelle il y aura une description la concenant. Afin d'intégrer cette documentation au design général de mon site, j'utilise un système d'inclusion de fichier. Les pages décrivant les fonctions seront quand à elles stockées dans un sous répertoire includes.
Voici la structure des fichiers:

Arborescence des fichiers

Méthode répandue

Le plus souvent voici comment les pseudos frames sont géréés:

     // Contrôle du paramètre passé via l'URL
     if (isset($_GET["page"])) {
          switch ($_GET["page"]) {
               case "in_array":
                    $includePage = "in_array.inc.php";
               break;
               case "glob":
                    $includePage = "glob.inc.php";
               break;
               case "str_pad":
                    $includePage = "str_pad.inc.php";
               break;
               default :
                    // Gestion de l'erreur : soit inclusion d'une page par défaut soit message d'erreur
               break;
          }
     }

     // Inclusion de la page demandée
     include "./includes/" . $includePage;

Il existe aussi une variante consistant à n'utiliser que des structures de contrôles à base de if ;-) ...
Dans les deux cas cela peut devenir vite complexe à gérer surtout si on a un grand nombre de pages à inclure. Aussi voici une technique pour que la quantité de pages ne soit plus un souci.

Quel est le tableau?

Après avoir au préalable adopté une norme pour les noms des pages - ici le nom de la fonction suivi de ".inc.php" - Il nous suffit de lister tous les fichiers répondant au filtre dans le répertoire includes. Les résultats seront alors stockés dans un tableau dans lequel nous aurons la liste de toutes les pages autorisés :D

Grâce à la fonction glob(), la moitié du chemin est faite. Ensuite il suffit de chercher si la page demandée est présente dans la liste ainsi générée.

     define("PATH", "./includes/");
     // Tableau contenant les pages autorisées
     $tableau = glob(PATH . "*.inc.php");
     if (isset($_GET["page"]) && in_array(PATH . $_GET["page"] . ".inc.php", $tableau)) {
          $pageInclude = PATH . $_GET["page"] . ".inc.php";
     }
     else {
          $pageInclude = PATH .  "default.inc.php";
     }
     include $pageInclude;

Grâce à cette méthode vous n'aurez pas à vous soucier du nombre de pages à inclure, il suffira de les nommer selon le masque défini.

Si vous vous sentez l'âme d'un "geek", vous pouvez toujours écrire le code sous cette forme:

     define("PATH", "./includes/");
     // Tableau contenant les pages autorisées
     include (isset($_GET["page"]) && in_array(PATH . $_GET["page"] . ".inc.php", glob(PATH . "*.inc.php"))) ?  PATH . $_GET["page"] . ".inc.php" :  PATH . "default.inc.php";

Le résultat sera le même mais le tout tient sur deux lignes mr green.

Ne pas oublier

  • Pour voir l'exemple, cliquez ici
  • Télécharger l'exemple complet : ici
  • Je vous renvoi à ce petit tutorial d'ElMoustiko si vous désirez en savoir plus sur les pseudos frames.

Mise à jour


Commentaires


[#1] Commentaire rédigé le Dimanche 21 Novembre 2004 à 18:28 par ElMoustiko

Impecab' ! Mais ma méthode n'est elle pas plus rapide au niveau du temps d'execution ?? parceque là tu dois récupérer tous les fichiers *.inc.php, les mettre dans un tableau, et ensuite tester la correspondance et enfin l'inclusion :o Avec le système que j'avais fait, on testait juste l'existence et on faisait telle ou telle action en fonction de l'existence ou non.
Je me pose la question parcequ'à vrai dire je n'y connait pas grand chose en temps d'execution et surcharge serveur, donc si tu pouvais m'éclairer.

Sinon, je pense imaginer un système template+pseudo frame grâce à XML, XSL et PHP, mais c'est encore à l'état de projet ;-)

Ahh oui aussi, le lien pour le tutoriel, c'est celui là, je l'ai mis à jour, faudrat que je fasse les modifs de lien un de ces
http://www.elmoustikoblog.net/tutoriels/php/pseudo...

[#2] Commentaire rédigé le Dimanche 21 Novembre 2004 à 18:39 par solo

Jpense effectivement que ta méthode peut aller plus vite au niveau process mais il faudrait voir avec un Bench avec quelques itérations successives :D

Je mets également le lien vers ton tuto ;-)

[#3] Commentaire rédigé le Dimanche 21 Novembre 2004 à 18:48 par ElMoustiko

Merci pour la correction du lien ;-)

Je sais même pas comment on fait un bench ::lol ::whistle

Pour revenir à mon histoire de template XML, il me reste à savoir comment faire un rendu xhtml à partir de mes fichiers XML et XSL pour pouvoir l'utiliser, t'as une idée ?

[#4] Commentaire rédigé le Dimanche 21 Novembre 2004 à 18:59 par solo

Je pense que ce billet pourrait t'intéresser

http://www.fredcavazza.net/index.php?2004/11/18/45...

Je voulais te demander ce que tu entendais par template. Parles tu tes moteurs de Template comme vTEmplate : http://vtemplate.sourceforge.net/

[#5] Commentaire rédigé le Dimanche 21 Novembre 2004 à 19:11 par ElMoustiko

Bah, j'en suis arrivé au même point que Fred Cavazza alors, j'arrive à rendre mon XML "joli" avec XSL(T) et un poil de CSS en plus, ça c'est facile et ça rend bien dans Firefox, Internet Explorer mais pas dans Opera. Enfin bref, moi ce que je voudrais c'est avoir le résultat *.html du fichier transformé via XSLT, parceque là quand on affiche la source on as le doc *.xml (logique). Donc je voudrais faire la création du fichier *.html correspondant aux données/contenu du *.xml et à la structure du document *.xsl et là je calle.

Ce que j'entend par template, et bien on a QUE le contenu dans des balises logiques (genre <titre>, <date>, <article>, ...) et ensuite on fait le traitement XSLT pour faire du bon vieux xHTML pour rendre le tout. Ca permet de n'avoir vraiment que la donnée utilisable n'importe comment ensuite (html, pdf, ...). On peut comme ceci, générer des menus (<categorie>, <item>, <subitem>, ...) et faire de même etc pour chaque partie de la page et générer les correspondance HTML via PHP je pense mais de quelle manière, bonne question...

[#6] Commentaire rédigé le Dimanche 21 Novembre 2004 à 19:18 par solo

Au final tu veux préserver ton XML brut ou le fait qu'il soit parsé via un script PHP puis transformé en page XHTML soit justement ton objectif?

ça mérite un topic sur le forum alsa ça non?

[#7] Commentaire rédigé le Dimanche 21 Novembre 2004 à 19:24 par ElMoustiko

Non, je veux pas préserver mon XML, je veux bien le parser via PHP (je pense) pour le transformer en xHTML, mais il faut prendre en compte les tansformations XSLT.

Wé c'est clair qu'un topic sur alsa serait l'idéal mais à vrai dire j'en parlais parceque ça avait un rapport étroit avec le truc :D. Mais j'ai pas le temps de m'occuper de régler ce problème en détail tout de suite, mais si tu avais eu une idée je l'aurais notée et gardée bien au chaud.

Sinon t'as fait le bench ? pour comparer les 2 systèmes de pseudo frames ?

[#8] Commentaire rédigé le Dimanche 21 Novembre 2004 à 19:35 par ElMoustiko

Ayé, j'ai trouvé le début, d'un prémice de quelque chose d'embryonaire !!!
http://www.phpindex.com/articles/articles_lire.php...

Je pense qu'on à tout sous la pogne, y a plus qu'a digérer, comprendre et mettre en oeuvre.

Un truc qui me fait plaisir, c'est que mon idée de template XML est la même que celle évoquée en fin d'article sur le lien pré-cité.

[irc]/me est content[/irc]

[#9] Commentaire rédigé le Dimanche 21 Novembre 2004 à 21:22 par solo

yO,

je n'ai pas fait le bench - dans la semaine surement :D
Pour ce Blog, j'ai été amené a écrire un petit moteur de Template. On pourrait imagine une version avancée ...

On en reparlera d'ici là et si tu avances sur le sujet n'hésites pas à me faire signe. ;-)

[#10] Commentaire rédigé le Lundi 22 Novembre 2004 à 13:07 par Clames

Merci pour ce tuto, je ne connaissais pas cette technique. Bien pratique finalement :-)

[#11] Commentaire rédigé le Jeudi 20 Janvier 2005 à 15:04 par Alexi

Super technique... mais est-ce sûr à 100%???

[#12] Commentaire rédigé le Mercredi 15 Juin 2005 à 14:36 par KneXtasY

Merci beaucoup pour cette technique !
Niveau sécurité, c'est mieux que de mettre directement l'adresse dans le get ;-) (comme j'ai la sale habitude de faire) !

[#13] Commentaire rédigé le Mardi 05 Juillet 2005 à 14:55 par E²xiT

Bonjour,
Je voudrai savoir comment modifier le code pour que l'inclusion apparaisse sous chaque lien sorrespondant ?

Merci beaucoup.

[#14] Commentaire rédigé le Mercredi 14 Septembre 2005 à 18:14 par Olivier Cartagena

Bonjour solo, peut-être te souviens-tu de moi? :-)
Je t'écris car j'ai un petit problème et apparemment c'est lié à ton système d'include que j'utilise sur mon site (qui marche à la perfection par ailleurs) bref, je suis en train de développer un livre d'or pour mon site et donc la première partie, c'est à dire aller chercher les messages dans la bdd, ça marche parfaitement mais dès que je veux afficher seulement une partie des messages (5 par exemple) et diviser par pages différentes, là ça n'affiche plus aucun message. J'ai déjà posté sur media-box mais je n'obtiens aucune aide. Aurais tu une idée de ce que ça peut-être?

[#15] Commentaire rédigé le Mercredi 28 Septembre 2005 à 16:31 par Mayday

Technique pour feignant qui oublie de mettre à jour leur tableau de pages à inclure...j'aime ^^

Par contre, j'ai toujours le même probleme et l'un d'entre vous va surement me donner la solution : Si j'envoie index.php?page=test?var1=truc&var2=machin
Je voudrais récupérer dans ma page test.inc.php les valeurs de var1 et var2

Il doit bien y avoir une méthode toute simple mais je pédale là !
Merci pour vos lumières.

[#16] Commentaire rédigé le Mercredi 28 Septembre 2005 à 16:35 par Thanh

Il suffit d'écrire ainsi ton url

index.php?page=test&var1=truc&var2=machin

et tes variables sont simplement accessibles avec $_GET["var1"] et $_GET["var2"]

:)

[#17] Commentaire rédigé le Mercredi 28 Septembre 2005 à 17:09 par Mayday

oui bon d'accord ::whistle

Je sors.

PS : merci beaucoup pour ta rapidité !

[#18] Commentaire rédigé le Mardi 04 Octobre 2005 à 18:27 par E²xiT

Bon, je donne un peu plus de précisions :)
Voila, sur mon site, j'ai une rubrique astuces et je voudrai que l'astuce apparaisse sous son nom.
Je ne sais pas comment faire.

Merci bien :)

[#19] Commentaire rédigé le Mardi 04 Octobre 2005 à 21:15 par Thanh

E²xiT, il te faut gérer soit un fichier, un tableau ou je ne sais quoi qui te permette de faire l'association entre un include et un nom d'include.

Au besoin va poser ta question sur le forum http://dreamweaver.media-box.net avec le script que tu utilises :)

[#20] Commentaire rédigé le Samedi 08 Octobre 2005 à 03:39 par pierito

Bonjour,

Voilà, je suis un débutant total ayant un site, le mien, à finaliser.

Je veux utiliser l'un des modes "include".

L'"include" doit se réaliser A L'intérieur d'une page.

C'est à dire une partie avant et après l' "include" doit être la page original.

Il est donc nécessaire de mettre un 1er code au début, au bon endroit (l'un de ceux que vous indiquez) , puis un autre code pour conclure avant la fin de la page.

Quel est-il ? Que peux-il être ?

:-)

[#21] Commentaire rédigé le Samedi 08 Octobre 2005 à 06:23 par Thanh

Bonjour pierito,

si tu dois gérer deux includes : un header et un footer il te suffit de faire un simple include des deux fichiers concernés en début et en fin de script. C'est forcément sécurisé puisque les fichiers appelés ne sont pas paramétrables.

Bon route dans l'apprentissage du PHP :)

[#22] Commentaire rédigé le Lundi 21 Novembre 2005 à 19:12 par E²xiT

C'est bon je me suis inspiré d'un code et je m'en suis fait un, il fonctionne très bien ;-)

Merci bien.

[#23] Commentaire rédigé le Dimanche 11 Décembre 2005 à 20:34 par Ueaki

Merci pour le tutO

[#24] Commentaire rédigé le Lundi 12 Décembre 2005 à 07:49 par Ueaki

kommen on fai pour autoriser plusieure page ?

[#25] Commentaire rédigé le Lundi 12 Décembre 2005 à 10:59 par Thanh

Bonjour Ueaki,

les fichiers se situant dans le repertoire include sont automatiquement "autorisés" :)

[#26] Commentaire rédigé le Lundi 12 Décembre 2005 à 12:38 par Ueaki

a ok Merci mr green

[#27] Commentaire rédigé le Lundi 12 Décembre 2005 à 17:04 par ToTo

est ce que on doit laisser les page
in_array
glob
str_pad ? si oui il serve a quoi ?
Merci d'avance

[#28] Commentaire rédigé le Lundi 12 Décembre 2005 à 17:11 par Thanh

Salut Toto,

Nan les fichiers servent d'exemples :)

[#29] Commentaire rédigé le Mercredi 14 Décembre 2005 à 09:13 par ToTo

ok merci:D

[#30] Commentaire rédigé le Mercredi 14 Décembre 2005 à 09:30 par Marin

quel qu'un peut m'expliquer le tableau en détail parce que je comprend pas tout :o

[#31] Commentaire rédigé le Mercredi 14 Décembre 2005 à 09:35 par Marin

et je dois metre le tableau sur toute les page que jai inclu ?

[#32] Commentaire rédigé le Mercredi 14 Décembre 2005 à 10:16 par Ploup

bonjour,
je voudré savoir comment autorisé
toute les page de mon serveur
Merci d'avance

[#33] Commentaire rédigé le Mercredi 14 Décembre 2005 à 19:36 par Thanh

@Marin et Ploup

je vous conseille de poster vos questions sur ce forum:


http://dream.media-box.net

J'y répondrais :)

[#34] Commentaire rédigé le Jeudi 15 Décembre 2005 à 19:35 par Sauron

bonjour,je voudré changer ce bou de code pour autorisé plusieur dossier

define("PATH", "./includes/" ) ;

[#35] Commentaire rédigé le Jeudi 15 Décembre 2005 à 21:55 par Thanh

Sauron,

Il faudrait modifier le code entier pour prévoir la gestion des sous dossier. Je verrais si je peux fournir un script allant dans ce sens.

En attendant pour toute question :

http://dream.media-box.net

:)

L'ajout de commentaire a été désactivé pour ce billet.

Trackbacks

Pisteurs vers ce billet (trackbacks entrant)

Il n'y a pas encore de pisteurs pour ce billet.

Pistés par ce billet (trackbacks sortant)

Il n'y a pas encore de pisteurs effectué par ce billet.


A propos du billet

  • Auteur : Thanh
  • Thématique :
    Développement, PHP
  • Publié : Vendredi 19 Novembre 2004 à 17h00
  • Nombre de lectures : 17721
  • Nombre de commentaires : 35
  • Ping : Les trackbacks sont fermés.
  • Tags :
Avatar de Thanh

Raccourcis

Rechercher un billet

Sous Rubriques

Photo Pif

Photopif