Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

INCLUDE "SECURISÉ" VIA FICHIER INI FACILEMENT EDITABLE


Information sur la source

Catégorie :Astuces Classé sous : include, ini, array, faille include, editable Niveau : Débutant Date de création : 01/05/2008 Vu : 2 749

Note :
6,67 / 10 - par 3 personnes
6,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (19)
Ajouter un commentaire et/ou une note

Description

Voila un simple code, Pratique qui inclu les page donné dans un fichier ini
peut servir dans plusieur cas , evite les faille "include" car on n'inclu indirectement le fichier
 

Source

  • <?php
  • $default='default.php';
  • $VarGet='file';
  • $IniFile='test.ini';
  • if(isset($_GET[$VarGet]))
  • {
  • $ini = parse_ini_file($IniFile,TRUE);
  • if(isset($ini['PAGE'][$_GET[$VarGet]])) #Si existe dans le fichier ini
  • {
  • #Existe dans le fichier
  • if(file_exists($ini['PAGE'][$_GET[$VarGet]])) #verifie l'existance du fichier
  • include($ini['PAGE'][$_GET[$VarGet]]); #Existe
  • else
  • include($default); #N'existe pas
  • }else #n'existe pas dans le fichier ini
  • include($default);
  • }
  • ?>
  • Fichier ini ->
  • [PAGE]
  • default=default.php
  • login=login.php
  • admin=admin.php
  • test=test.php
  • ini=test.ini
  • [/PAGE]
  • [AUTRE]
  • [/AUTRE]
<?php 
$default='default.php';
$VarGet='file';
$IniFile='test.ini';

if(isset($_GET[$VarGet]))
{
	$ini = parse_ini_file($IniFile,TRUE);
	if(isset($ini['PAGE'][$_GET[$VarGet]])) #Si existe dans le fichier ini 
	{
	                #Existe dans le fichier
			if(file_exists($ini['PAGE'][$_GET[$VarGet]])) #verifie l'existance du fichier

				include($ini['PAGE'][$_GET[$VarGet]]); #Existe
			
			else 
				include($default); #N'existe pas 
	}else #n'existe pas dans le fichier ini

		include($default); 

}

  ?> 


Fichier ini ->


[PAGE]
default=default.php
login=login.php
admin=admin.php
test=test.php
ini=test.ini
[/PAGE]
[AUTRE]
[/AUTRE]

Conclusion

Voila un simple code qui fait un include de facon securisé est simple et facile a edité

Simple mais efficace
 

Commentaires et avis

signaler à un administrateur
Commentaire de depression le 01/05/2008 08:43:22

Bon, l'intention est louable, ça c'est sûr.

Mais tu t'embêtes pour rien!


Pour sécuriser un include, tu peux utiliser aussi file_exists(), qui empêche que l'on appelle des fichiers proventant d'ailleurs, ou alors faire un switch(), comme ça, tu contrôlles tout, le code d'inclusion est dans un seul fichier, et tu peux facilement implémenter des règles de droits d'accès.

signaler à un administrateur
Commentaire de pysco68 le 01/05/2008 09:14:55 6/10

Je me joins à Depression.... et puis sinon require_once() et include_once()... et pour ta gestion d'erreur je ferrais comme ça:

require_once("chemin/vers/mon/fichier/include") or die("Le fichier untel n'a pas pu être chargé!");

qui est au final une solution tout aussi efficace, et bien plus sécurisée puisqu'un intenaute ne pourra pas accéder à ta liste de fichiers inclus contrairement à ton fichier ini...

De moi un 6/10 parce que sinon le code est correcte même si je pense que tu devrait t'habituer à donner encore un peux plus de commentaires (du genre: $default: 'xyz.php'; // Mettez ici.... blah) et à te trouver une façon unifiée d'écrire tes noms de variables (pas changer tout le temps entre Min/Majuscules pour une meilleur lisibilité)...

Bonne journée

signaler à un administrateur
Commentaire de didoudu17 le 01/05/2008 09:26:07

Salut moi je me complique un peu la vie^^ mais j'utilise des if :

    <?php
    if ($_GET['page'] == "accueil")
    {
        include("accueil.php");
    }
    
    if ($_GET['page'] == "news")
    {
        include("news.php");
    }
    
    if ($_GET['page'] == "inscription")
    {
        include("inscription.php");
    }
    
    ?>

signaler à un administrateur
Commentaire de webdeb le 01/05/2008 10:13:54

Attention ton code est secure à condition aussi que ton fichier INI se trouve dans un répertoire situé en dehors de la racine web ou bien dans un répertoire interdit en lecture par un fichier .htaccess. En effet, le format INI est rendu comme du texte brut dans un navigateur. Il n'est pas interprêté par le serveur web. Donc son contenu doit-être protégé en lecture et en écriture.

++

signaler à un administrateur
Commentaire de malalam le 01/05/2008 10:40:35 administrateur CS

Hello,

je trouve aussi l'intention louable. Ceci dit, passer par parse_ini_file() pour ça me semble un peu compliqué. Mais pourquoi pas.

@pysco68 => require_once("chemin/vers/mon/fichier/include") or die("Le fichier untel n'a pas pu être chargé!");
ton or die() ne sert à rien. require génère une erreur fatale si le fichier demandé n'existe pas, et ne renvoie jamais false. Ton die() ne sera jamais exécuté. Ce genre de solution n'est de toute manière pas satisfaisante : on n'essaye pas d'éviter une erreur, on fonce dedans en se disant que si une erreur survient, on quitte le script. Il vaut toujours bien mieux vérifier qu'on n'aura pas d'erreur, plutôt.
Et je ne comprends pas ta phrase qui suit ce bout de code, au passage.

signaler à un administrateur
Commentaire de willeraser le 01/05/2008 11:51:41 7/10

Au lieu de permettre aux surfeurs de connaitre le nom des fichiers php que tu utilises, il faut mieux que tu les stock dans un array au moins ca evite que la liste soit lisible.

Sinon, c'est une bonne idée, mais il existe des solutions infiniment plus simples et tout aussi sécurisées, comme certains l'ont dit, en couplant un switch et ensuite avec file_exists() puisque switch te permettra de facon indirect de lister tous les fichiers que tu autorises a l'inclusion et de gérer le cas ou l'utilisateur rendre n'importe quoi (default:)

signaler à un administrateur
Commentaire de malalam le 01/05/2008 11:58:18 administrateur CS

Heu ça fait 2 fois : je pourrais savoir en quoi la liste est lisible...?

signaler à un administrateur
Commentaire de JoJo738 le 01/05/2008 12:42:33

Salut,

Je rejoins Malalam (salut ^^) dans ses commentaires.

M'enfin, moi j'utilise des includes en fonction de l'architecture de mes dossiers/fichiers ..., je trouve ça plus simple et plus portable

Webdeb & Willeraser > Mais pour rendre le fichier .ini non lisible, il existe une méthode très simple : un fichier config.ini.PHP et mettre en 1er ligne de code :
;<?php die('Hacking !'); ?>
Et voila, fichier sécurisé !

signaler à un administrateur
Commentaire de kiki67100 le 01/05/2008 12:48:10

Merci pour vos commentaire,

Enfete le principe de mon code est de pouvoir editer mon "array" (fichier ini) sans modifier le code php

webdeb-> Je suis daccord avec toi on simplement mettre un "." devant le nom du fichier ou le mettre simplement d'un repertoire avec "deny from"

Je prefere utilise les array car on ne vois pas le nom réel des fichier inclu

didoudu17-> Oulalala tu te complique la vie utilise plutot mon code mais ya beaucoup plus simple :)

signaler à un administrateur
Commentaire de willeraser le 01/05/2008 13:06:09

Fichier ini ->
[PAGE]
default=default.php
login=login.php
admin=admin.php
test=test.php
ini=test.ini
[/PAGE]
[AUTRE]
[/AUTRE]

*.ini, a moins d'ajouter les .ini dans le htaccess avec un deny from, ils vont ressortir en mode texte, comme avec la plupart des fichiers *.inc
c'est pour ca qu'il faut pas mettre de code php dans un fichier .inc lisible par tout le monde, sinon ca devient du open source involontaire ^^

signaler à un administrateur
Commentaire de malalam le 01/05/2008 13:17:42 administrateur CS

Encore faut-il parvenir à accéder au serveur de manière à connaître les noms des fichiers pour pouvoir récupérer le .ini.
Et de toute manière, c'est de la sécurisation de base; et c'est valable pour beaucoup d'autres choses : xml par exemple.
Ensuite, j'aimerais savoir en quoi cela peut poser problème qu'un utilisateur connaisse les fichiers inclus dans un site ? Non parce que pour ça, il suffit de surfer sur le site hein...et on les connait tous, les .php utilisés...et ?

signaler à un administrateur
Commentaire de willeraser le 01/05/2008 13:23:28

tu ne connais pas necessairement les fichiers inclus, si tu utilise par exemple une url genre index.php?page=1

et que tu as un switch qui dit que case 1: include 'pageblabla.php';

le nom est pas connu du surfeur.
le probleme d'un site ou tu connais tous les noms de fichiers est que tous les sites ne sont pas bien sécurisés, et qu'un fichier qui normalement doit etre inclu n'est pas sensé etre appellé de facon orpheline (basename pour regler ca, mais combien de personnes le font ? )

enfin jsais pas, c'est une regle quoi, autant faire en sorte que le surfeur en sache le moins sur la facon dont s'execute le script, c'est mieux ainsi, du moins c'est mon point de vue

signaler à un administrateur
Commentaire de kiki67100 le 01/05/2008 14:03:06

malalam ,Je suis daccord avec toi si le site en question est bien codé cela ne devraient pas posé de problème de savoir le nom réel. mais dans mon cas les page que ne peuve pas être apeller de facon "orpheline" comme dis willeraser ,J'ai des fonction qui son apeller de le fichier "père" (celui qui inclu) et non dans mes fichier qui son inclu on va dire c'est un peut de "la sécurité par l'obscurité"

signaler à un administrateur
Commentaire de malalam le 01/05/2008 14:51:19 administrateur CS

Ne prenez pas l'exemple de sites fonctionnant par inclusions, mais de sites classiques basés juste sur des pages. Je ne vois pas en quoi cela change quelque chose que l'on voit ou non machin.php plutôt que main.php?page=1.
Si le site est mal codé, dans les 2 cas, les problèmes sont les mêmes. Ca n'est pas moins sécurisé de voir le nom des fichiers php utilisés.
Parce que être parano, c'est bien...mais il faut l'être à bon escient : vous ne serez pas plus capable de sécuriser dans un cas que dans l'autre. Et si vous faîtes face à un piratin ayant un meilleur niveau que vous, dans les deux cas, il trouvera la faille. On ne sécurise pas un site pour les utilisateurs lambda, parce qu'eux ne représentent pas une menace : ils ne savent pas comment exploiter une faille.
Un bon piratin le sait, lui...et si vous n'avez pas un bon niveau, dans les deux cas, vous êtes morts.
Et si vous avez un bon niveau...que votre site affiche ou non en clair dans l'url les fichiers php qu'il utilise, ça ne changera rien, c'est le piratin qui est mort.
Bref, un bon piratin verra la lumière dans l'obscurité, croyez-moi...penser que simplement masquer le nom des fichiers utilisé est une sécurité est illusoire dans ce cas.
Il faut bien plus s'intéresser aux injections et autres XSS...et les XSS se basent souvent sur...des POST ou des GET...en se contrefichant éperduement du nom des fichiers que VOUS vous incluez, de manière masquée ou non. Parce que ce ne sont pas VOS scripts qui l'intéressent dans ce cas, mais les siens...à priori, les vôtres ne peuvent pas faire de mal à votre site ;-)

signaler à un administrateur
Commentaire de amezghal le 01/05/2008 22:53:29

Salut,
perso j'utilise un tableau + url rewriting:
par exemple:
$pages=array('home','contact','admin');
if(isset($_GET['page']) && in_array($pages, $_GET['page'])){
   require $_GET['page'].'.php';
} else {
   require page par defaut en cas derreur;
}

signaler à un administrateur
Commentaire de didoudu17 le 02/05/2008 07:03:15

salut,
pas mal ta technique amezghal je pense que je vais faire pareil c plus pratique

signaler à un administrateur
Commentaire de coucou747 le 02/05/2008 15:13:18

amezghal, si tu utilises l'utlrewriting pour tes index.php?page=truc, alors t/as une solution qui t'evites le in_array et qui t'evites bon nombre de XSS :

tu peux simplement interdire l'acces aux pages qui ne viennent pas par rewrite.

signaler à un administrateur
Commentaire de kiki67100 le 03/05/2008 18:19:14

Amezghal , tu peut mettre ton array dans le fichier ini aussi qui simplifie l'edite de ton array avec mon code par exemple

signaler à un administrateur
Commentaire de emilia123 le 13/05/2008 08:29:38 7/10

bonjour à tous,
Je pense que l'idée est sympa, et change des gros IF ou SWITCH que l'on voit habituellement.
la solution avec un require ou include + file_exists n'est pas suffisante.
si j'appel "index.php?page=admin/.htpasswd" ca va juste inclure le fichier admin/.htpasswd
pourtant file_exists serait utilisé.

faire un include/require directement à partir d'une variable GET ou POST est toujours dangereux.
passer par un traitement intermediaire est nécessaire et ce code est sympa.
Il marche sans modif pour 1 ou 1000 pages (contrairement aux tests via IF ou SWITH)
Il marche avec des ajouts de pages (contrairement aux tests via IF ou SWITH)
Il n'inclus vraiment que ce qu'on laisse include (contrairement aux include/require)

Voila voila
Biz
EM.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Include dans un tableau Array ? [ par hakeem69 ] Bonjour à tous <p class="MsoNormal" style Problème Include dans php.ini sous Windows [ par fabienfs ] Bonsoir,J'ai installer php5.2.2 sur mon serveur qui tourne sous Windows 2003 Server, ca fonctionne très bien sauf que j'ai un petit problème avec les mise en page PHP/CSS [ par la_main_sur_le_katana ] Bonjour,je suis entrain de faire une apllication PHP/MYSQL pour un site web et j'aurais une question concernant la mise en page d'une partie du site. Array to String [ par Aaron ] Hello à tous,J'aimerais savoir s'il est possible d'obtenir un résultat du genre :$req = "INSERT INTO `$table` (`champ1`, `champ2`, `champ3`...) VALUES un include dans un include?? [ par val_lala ] Bonjour,J'ai un petit soucis de include (a moins que ce soit une faute bete de lien...)Voila je dois expliquer vite fait l'arborescense du site pour e Aide Algorithme ... [ par younes371 ] Bonjour,Je viens vers vous pour vous demander un conseil ...bon voilà mon probleme,j ai 3 tables MySQL : "Taches, User, Affaire et Fonction ".je veux methode PHP [ par jenesaistoujoursrien ] Bonjour,   Je ne suis pas un grand spécialiste en PHP, mais je pense que je me débrouille.   <p include [ par kelm_by ] salut tous le monde,j'ai un problemes c'est que je ne sais pas comment faire pour afficher le contenu d'une page dans une autre page j'ai essayer avec include [ par xzonz ] bonjour a toutes et tous voila j'ai un souci avec includej'aimerai mettre un fichier config.php sur mon site pour eviter de mettre dans chaque pagele Changement valeur d'un varible array [ par alex2100 ] Bonjour à tous,J'ai un tab array comme ceci,&lt;?php/* Programme : fr_cosat.Inc* Description : LANGUE FRANCAISE DU SITE* Auteur : Jean-Alexandre Denis


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,312 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.