Twitter

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 ::mrgreen.

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

35 Comments to Pseudo Frames en pratique : includes sécurisés

  1. 21 novembre 2004 at 18 h 28 min | Permalink

    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_frame/

  2. 21 novembre 2004 at 18 h 39 min | Permalink

    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. 21 novembre 2004 at 18 h 48 min | Permalink

    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. 21 novembre 2004 at 18 h 59 min | Permalink

    Je pense que ce billet pourrait t’intéresser

    http://www.fredcavazza.net/index.php?2004/11/18/457-xslt-le-tueur-de-lxhtml

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

  5. 21 novembre 2004 at 19 h 11 min | Permalink

    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 , ,

    , …) 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 (, , , …) 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. 21 novembre 2004 at 19 h 18 min | Permalink

    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. 21 novembre 2004 at 19 h 24 min | Permalink

    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. 21 novembre 2004 at 19 h 35 min | Permalink

    Ayé, j’ai trouvé le début, d’un prémice de quelque chose d’embryonaire !!!
    http://www.phpindex.com/articles/articles_lire.php3?element=301

    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. 21 novembre 2004 at 21 h 22 min | Permalink

    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. 22 novembre 2004 at 13 h 07 min | Permalink

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

  11. 20 janvier 2005 at 15 h 04 min | Permalink

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

  12. KneXtasY's Gravatar KneXtasY
    15 juin 2005 at 14 h 36 min | Permalink

    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. 5 juillet 2005 at 14 h 55 min | Permalink

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

    Merci beaucoup.

  14. 14 septembre 2005 at 18 h 14 min | Permalink

    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. Mayday's Gravatar Mayday
    28 septembre 2005 at 16 h 31 min | Permalink

    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. 28 septembre 2005 at 16 h 35 min | Permalink

    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. Mayday's Gravatar Mayday
    28 septembre 2005 at 17 h 09 min | Permalink

    oui bon d’accord ::whistle

    Je sors.

    PS : merci beaucoup pour ta rapidité !

  18. 4 octobre 2005 at 18 h 27 min | Permalink

    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. 4 octobre 2005 at 21 h 15 min | Permalink

    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. pierito's Gravatar pierito
    8 octobre 2005 at 3 h 39 min | Permalink

    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. 8 octobre 2005 at 6 h 23 min | Permalink

    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. 21 novembre 2005 at 19 h 12 min | Permalink

    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. Ueaki's Gravatar Ueaki
    11 décembre 2005 at 20 h 34 min | Permalink

    Merci pour le tutO

  24. Ueaki's Gravatar Ueaki
    12 décembre 2005 at 7 h 49 min | Permalink

    kommen on fai pour autoriser plusieure page ?

  25. 12 décembre 2005 at 10 h 59 min | Permalink

    Bonjour Ueaki,

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

  26. Ueaki's Gravatar Ueaki
    12 décembre 2005 at 12 h 38 min | Permalink

    a ok Merci ::mrgreen

  27. ToTo's Gravatar ToTo
    12 décembre 2005 at 17 h 04 min | Permalink

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

  28. 12 décembre 2005 at 17 h 11 min | Permalink

    Salut Toto,

    Nan les fichiers servent d’exemples :)

  29. ToTo's Gravatar ToTo
    14 décembre 2005 at 9 h 13 min | Permalink

    ok merci:D

  30. Marin's Gravatar Marin
    14 décembre 2005 at 9 h 30 min | Permalink

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

  31. Marin's Gravatar Marin
    14 décembre 2005 at 9 h 35 min | Permalink

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

  32. Ploup's Gravatar Ploup
    14 décembre 2005 at 10 h 16 min | Permalink

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

  33. 14 décembre 2005 at 19 h 36 min | Permalink

    @Marin et Ploup

    je vous conseille de poster vos questions sur ce forum:

    http://dream.media-box.net

    J’y répondrais :)

  34. Sauron's Gravatar Sauron
    15 décembre 2005 at 19 h 35 min | Permalink

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

    define(« PATH », « ./includes/ » ) ;

  35. 15 décembre 2005 at 21 h 55 min | Permalink

    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

    :)

Saisir un commentaire

Vous pouvez utilisez les balises HTML suivantes, ainsi que les attributs associés : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Photographie

Tranches de vie on Facebook