8792 sujets

Développement web côté serveur, CMS

Bonjour,

actuellement sur mon site internet www.cccwindbeutel.info
j'ai un index.php dans lequel j'ai 5 include :
2 header
1 sommaire
1 contenu
1 footer

Pour le contenu, voici le code :

a écrit :

<div id="contenu">
<?php

// On définit le tableau contenant les pages autorisées
// ----------------------------------------------------
$pageOK = array('accueil' => 'pages/accueil.php',
'histoire' => 'pages/histoire.html',
'windbeutel' => 'pages/windbeutel.html',
'membres' => 'pages/membres.html',
'calendrier' => 'pages/calendrier.html',
'princes' => 'pages/princes.html',
'ducs' => 'pages/ducs.html',
'anecdotes' => 'pages/anecdotes.html',
'liens' => 'pages/liens.html',
'presse' => 'pages/presse.html',
'logos' => 'pages/logos.html',
'contact' => 'pages/contacts.php',
'formulairesource' => 'pages/formulairesource.php');


// On teste que le paramètre d'url existe et qu'il est bien autorisé
// -----------------------------------------------------------------
if ( (isset($_GET['page'])) && (isset($pageOK[$_GET['page']])) )
{
include($pageOK[$_GET['page']]); // Nous appelons le contenu central de la page
}
else
{
include('pages/accueil.php'); // Page par défaut quant elle n'existe pas dans le tableau
}
?>
</div>


Le problème est qu'à force de rajouter des pages, je ne pourrai pas faire la liste éternelle de tous les emplacements de pages.

Alors je cherche une solution pour que la sécurité de la variable reste, c'est à dire, pas de URL possible dans la variable ou de page qui se trouve ailleurs, enfin vous comprenez. Moi je ne sais pas trop ce qui peut se passer au niveau sécurité, j'ai vu ce code sur un site lors d'un cours sur le php pour faire un index.php?page= ....

Donc si je rajoute des pages, je ne peux pas mettre toute la liste dans le index.php

Deuxièmement, j'aimerais trouver une meilleure technique car pour l'instant, elles se trouvent toutes dans le dossier /pages/

J'ai mis cela dans le .htaccess :
a écrit :

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^page-( Smiley abcdefghijklmnopqrstuvwxyz +)$ /index.php?page=$1 [L]


Donc tous mes liens sur le site sont de la forme :
page-accueil
page-membres
page-calendrier

et ils amènent aux pages respectives :
index.php?page=accueil
index.php?page=membres
index.php?page=calendrier
sans que le visiteur ne voit quoi que ce soit.

Dites moi quelle solution je peux envisager lorsque j'aurai plus de pages et différents dossiers de pages.

(tout en gardant un URL Rewriting, qu'il faudra m'expliquer si vous me proposez une méthode avec plus qu'une variable "page")

Merci beaucoup car c'est un problème relativement important dans la mesure où un site n'a jamais fini de grandir.

Cordialement,

Christopher Bender
Modifié par Mister_ben (28 Apr 2006 - 01:04)
Bonsoir

J'ai fait de nombreuses recherches cet après-midi ainsi que ce soir et je n'ai pas trouvé de meilleure solution.

1°/ J'ai trouvé une solution avec la variable $_SERVER['DOCUMENT_ROOT'] à placer dans le include du genre :

a écrit :

Simple fichier test.php

<? $racine=$_SERVER['DOCUMENT_ROOT']; ?>
<? include($racine.'/'.$page.'.php'); ?>


Donc on ne peut pas mettre d'URL extérieur mais on peut se balader dans le dossier forum, galerie, etc.. en prenant soin de ne mettre en paramètre page= que des pages en .php

Le problème : les pages à passer en paramètres ne sont pas toutes en .php
J'ai aussi de simples pages membres.html, calendrier.html à inclure sur le site.

Donc :

2°/ Il suffit d'enlever le .php du include

a écrit :

Simple fichier test2.php

<? $racine=$_SERVER['DOCUMENT_ROOT']; ?>
<? include($racine.'/'.$page); ?>


Problème : on peut se balader dans les dossiers et voir les .htaccess, .htpasswd, etc...

3°/ Je cherche encore ...

Si cela continue, je crois que je fais continuer avec mon array et mettre toutes mes pages autorisées à l'intérieur.

Ou bien il y a une possibilité mais que je n'envisage pas tellement :
faire des pages .php et mettre à "chaque fois" en haut et en bas les include des différents éléments.
Mais j'avoue que c'est pas TOP !

Je préfère garder mon index.php? et trouver une solution....

Merci d'avance.

Cordialement,

Christopher Bender



#EDIT : je viens de penser à une autre solution encore plus pratique mais que je ne sais pas mettre en oeuvre !
Il suffirait de créer une table mysql en 2 colonnes :
- valeurs autorisées pour le paramètre
- redirections pour chaque valeur
Donc ensuite, il suffit de faire une page protégée admin protégée par mot de passer et sur laquelle il y aurait un formulaire à 2 champs :
- un pour la nouvelle valeur autorisée
- un pour la page vers laquelle redirige cette valeur
On valide et cela envoie l'entrée dans la table mysql...

Comment faire ? Je ne sais point !
Modifié par Mister_ben (28 Apr 2006 - 00:08)
Bonjour,

Tu peux, afin d'éviter tout navigation, afficher un message d'erreur si un slash apparaît dans $_GET['page']

par exemple :


<?php
if(strstr("/", $_GET['page']))
{
   die("Vous avez tenté de naviguer à travers les dossiers du site");
}
else
{
  // Tout va bien
}
?>
Merci beaucoup pour votre réponse !!!

J'ai modifié un peu le code que vous m'avez donné car il y avait une inversion dans le strstr() (J'ai effectué une recherche dans google pour voir la syntaxe de strstr() car cela ne fonctionnait pas...)

Voici le code que j'ai mis dans le test2.php (copie de l'index.php)
(Je ne vous mets que le div contenu)

a écrit :

<div id="contenu">
<?php

$racine=$_SERVER['DOCUMENT_ROOT'];

if(strstr($_GET['page'],"/"))
{
echo("Vous avez tenté de naviguer à travers les dossiers du site");
}
else
{
if (file_exists('pages/'.$page.'.php'))
{
$page=$page.'.php';
$filename = $racine.'/pages/'.$page;
include($filename);
}
else
{
if (file_exists('pages/'.$page.'.html'))
{
$page=$page.'.html';
$filename = $racine.'/pages/'.$page;
include($filename);
}
else
{
include("pages/accueil.php");
}
}
}
?>
</div>


a écrit :

Si le code est bon, cela teste si le paramètre page contient un "/"
---Si oui, afficher le message d'erreur Smiley smile
---Si non, cela teste si la page existe en extension .php
------Si ok, afficher !
------Si pas ok, cela teste si la page existe en extension .html
---------Si ok, afficher !
---------Si pas ok, afficher accueil.php


(les pages de contenu se trouvent dans /pages/)

Dites moi si le code est sécurisé.
Merci beaucoup.

Pour l'instant, les pages sont accessibles.
Vérifier :
www.cccwindbeutel.info/test2.php?page=accueil (elle est en .php)
www.cccwindbeutel.info/test2.php?page=calendrier (elle est en .html)
www.cccwindbeutel.info/test2.php?page=contacts (en .php)

Tout cela fonctionne.

Il ne vous reste plus qu'à me dire si le code est sécurisé Smiley smile
Merci d'avance.

Cordialement,

Christopher Bender

P.S. Merci encore à Dolerho


#EDIT : j'ai mis à jour l'URL Rewriting (en phase de test pour ne pas courcircuiter l'index.php encore présent)

a écrit :

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^page-( Smiley abcdefghijklmnopqrstuvwxyz +)$ /index.php?page=$1 [L]
RewriteRule ^page2-( Smiley abcdefghijklmnopqrstuvwxyz +)$ /test2.php?page=$1 [L]


Et je constate que les pages :
www.cccwindbeutel.info/page2-accueil
www.cccwindbeutel.info/page2-calendrier
www.cccwindbeutel.info/page2-contacts
sont accessibles.

Et le MUST ? on ne peut pas mettre de "/" dans le "paramètre" après "page2-" car l'URL Rewriting est tel qu'il ne prend pas les / mais que les lettres de "a" à "z".



SVP, Pouvez-vous me confirmer la sécurité du code ?
Merci !
Modifié par Mister_ben (29 Apr 2006 - 00:15)
Bonsoir,
j'aimerais toujours savoir, sans vouloir être pressé Smiley confus , si mon code est sécurisé ou pas.
Merci beaucoup.

@ bientôt,

Christopher

P.S. Dès que j'ai la réponse, => Résolu Smiley cligne