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)
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.
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 ;-)
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é"
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
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 ?
*.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 ^^
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é !
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:)
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.
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.
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é)...
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.
13 mai 2008 à 08:29
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.
3 mai 2008 à 18:19
2 mai 2008 à 15:13
tu peux simplement interdire l'acces aux pages qui ne viennent pas par rewrite.
2 mai 2008 à 07:03
pas mal ta technique amezghal je pense que je vais faire pareil c plus pratique
1 mai 2008 à 22:53
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;
}