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 commentaires à “ Pseudo Frames en pratique : includes sécurisés ”


  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. Merci pour ce tuto, je ne connaissais pas cette technique. Bien pratique finalement :-)


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


  12. 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. Bonjour,
    Je voudrai savoir comment modifier le code pour que l’inclusion apparaisse sous chaque lien sorrespondant ?

    Merci beaucoup.


  14. 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. 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. 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. oui bon d’accord ::whistle

    Je sors.

    PS : merci beaucoup pour ta rapidité !


  18. 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. 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. 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. 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. 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. Merci pour le tutO


  24. kommen on fai pour autoriser plusieure page ?


  25. Bonjour Ueaki,

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


  26. a ok Merci ::mrgreen


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


  28. Salut Toto,

    Nan les fichiers servent d’exemples :)


  29. ok merci:D


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


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


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


  33. @Marin et Ploup

    je vous conseille de poster vos questions sur ce forum:

    http://dream.media-box.net

    J’y répondrais :)


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

    define(”PATH”, “./includes/” ) ;


  35. 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

    :)

Laissez un commentaire