INCLUDE "SECURISÉ" VIA FICHIER INI FACILEMENT EDITABLE

cs_depression Messages postés 100 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 13 juillet 2009 - 1 mai 2008 à 08:43
cs_emilia123 Messages postés 122 Date d'inscription mercredi 19 décembre 2001 Statut Membre Dernière intervention 5 janvier 2009 - 13 mai 2008 à 08:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/46517-include-securise-via-fichier-ini-facilement-editable

cs_emilia123 Messages postés 122 Date d'inscription mercredi 19 décembre 2001 Statut Membre Dernière intervention 5 janvier 2009
13 mai 2008 à 08:29
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.
kiki67100 Messages postés 313 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 10 août 2013 1
3 mai 2008 à 18:19
Amezghal , tu peut mettre ton array dans le fichier ini aussi qui simplifie l'edite de ton array avec mon code par exemple
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 mai 2008 à 15:13
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.
didoudu17 Messages postés 16 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 6 mai 2008
2 mai 2008 à 07:03
salut,
pas mal ta technique amezghal je pense que je vais faire pareil c plus pratique
amezghal Messages postés 385 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 21 août 2015 5
1 mai 2008 à 22:53
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;
}
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
1 mai 2008 à 14:51
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 ;-)
kiki67100 Messages postés 313 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 10 août 2013 1
1 mai 2008 à 14:03
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é"
willeraser Messages postés 55 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 6 mai 2009
1 mai 2008 à 13:23
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
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
1 mai 2008 à 13:17
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 ?
willeraser Messages postés 55 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 6 mai 2009
1 mai 2008 à 13:06
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 ^^
kiki67100 Messages postés 313 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 10 août 2013 1
1 mai 2008 à 12:48
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 :)
JoJo738 Messages postés 1267 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 29 juin 2010 2
1 mai 2008 à 12:42
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é !
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
1 mai 2008 à 11:58
Heu ça fait 2 fois : je pourrais savoir en quoi la liste est lisible...?
willeraser Messages postés 55 Date d'inscription mercredi 15 octobre 2003 Statut Membre Dernière intervention 6 mai 2009
1 mai 2008 à 11:51
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:)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
1 mai 2008 à 10:40
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.
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
1 mai 2008 à 10:13
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.

++
didoudu17 Messages postés 16 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 6 mai 2008
1 mai 2008 à 09:26
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");
}

?>
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
1 mai 2008 à 09:14
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
cs_depression Messages postés 100 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 13 juillet 2009
1 mai 2008 à 08:43
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.
Rejoignez-nous