Forum Programmation.php Colmaté un trou de sécurité dans une page web

Posté par  (site web personnel, Mastodon) .
Étiquettes : aucune
0
15
jan.
2005
Bonjour,
j'utilise souvent des pseudo-frame en php. J'ai remarqué que j'avais
un trou de sécurité sur certain site.
Exemple j'appel les pages avec ?page=lapage
Voici ce que j'ai comme code dans index.php:

$page = "repertoire/$page.php";
if (file_exists($page))
{
include ("$page");
}
else
{
include ("repertoire/accueil.php") ;
}

C'est pas l'idéal au niveau sécurité.
Que pensez-vous de cette parade? :

$page = ereg_replace( "/", "zdferwfsrehre", $page );
$page = "repertoire/$page.php";
if (file_exists($page))
{
include ("$page");
}
else
{
include ("repertoire/accueil.php") ;
}

Cela a l'air plus sur si quelqu'un fait ?page=../../../../etc/machin
il va jamais pouvoir sortir de mon répertoire vus que les / seront remplacé par
une chaîne de caractère.

Je vous remercie d'avance
  • # Ma méthode

    Posté par  . Évalué à 3.

    Salut

    J'ai été partiellement confronté à ce problème pour la réalisation sommaire de mon site.
    Les contraintes que j'avais :
    - le sommaire ne devais pas dans le code de chaque page
    - il devait être le plus automatisé possible
    - respect des normes (XHTML 1.0 (pas le temps pour passer au 1.1) et CSS 2)

    Ma solution : j'ai un fichier .xml qui contient la liste des pages de mon site, un dossier pages qui contient les pages.
    Lorsque qu'on fait index.php?page=test, il cherche dans le .xml la page dont le nom est test, puis l'affiche, ou affiche l'accueil en cas de problème...
    Si tu le veux, envoie moi un message privé...
  • # Pseudo Frames

    Posté par  . Évalué à 2.

    Salut !!!

    Moi personnelement j'utilise une base de données pour mettre mes variables de pages en memoire (id_page, titre, mot clé, menu que je lui associe et ainsi de suite)

    Au depart quand j'ai commencé je me suis inspiré de ce tuto http://www.toutestfacile.com/phpinit.php?tef_site=php&chap=fram(...)

    Voila j'espere que ce t'aidera..
  • # 2-3

    Posté par  (site web personnel) . Évalué à 2.

    2-3 trucs, met tes pages dans un répertoire à part, et teste si la pagequ'on demande peut-être réduite : page=repertoire_de_page/../../../passwd
    c'est moyen simple de ne pas permettre de remonter l'arborescence.
  • # Si c'est pas trop tard, voici ma façon de procéder :

    Posté par  . Évalué à 1.

    J'ai un script-shell qui me créé les liens symboliques nécessaires aux menus de mon application php. Ces liens sont créés dans une arborescence à part, appelée menu, comportant autant de sous-répertoires que de sous-menus, et des liens un peu plus explicites que truc1.php (par exemple :
    menu/01-utilisateurs/01-liste des utilisateurs.php -> ../../ecrans/gestUtils.php
    Je me sers du nom des sous-répertoires et de celui des fichiers pour créer mon menu.
    Celui-ci est parcouru par un script php qui me transforme ça en une belle variable $xml, qui comme son nom l'indique contient une description xml de mon menu. Cette variable est transformée, grâce à une feuille de transformation xslt en un beau formulaire xhtml strict mis en forme grâce à une feuille de style css.
    Voilà pour la partie technique.
    Pour ce qui est du fonctionnement de ce menu, j'ai bâti un formulaire à part du formulaire des données, ce qui me permet d'agir différement (page de traitement différente dans l'attribut action du formulaire. Les éléments du menu sont des input type="submit" de ce formulaire avec un beau nom transformé depuis les noms des liens symboliques en un terme explicite pour les utilisateurs.
    Lors de la création du menu initial (celui en xml), je créée également dans la session de l'utilisateur un tableau associatif texte affiché->nom réel du lien symbolique. Comme ça, l'utilisateur ne peut pas de trop chercher où est mon fichier, ni comment il s'appelle.
    Enfin, pour éviter les petits malins qui rempliraient le formulaire avec leurs entrées plutôt qu'avec celles que je propose sur mes boutons submit, je vérifie avant tout que la variable $_POST['menu'] ne contient aucun ../ avant de faire un include sur le lien symbolique en lui même.
    Voilà en gros comment je procède. Ca peut parraître compliqué, mais en fait les scripts ne font chacun pas plus que quelques dixaines de lignes, et les choses sont ainsi bien cloisonnées.
    Enfin, mais ça, c'est ma façon de faire, j'excècre les formulaires et tout ce qui me colle une url a vomir dans mon navigateur, je passe donc le plus souvent possible par des liens, et si je ne peux pas faire autrement par des formulaires en method="post". La seule entorse concerne les images générées dynamiquement depuis php, avec un script à part.
    Merci d'avances à ceux qui lirons ce post de critiquer (de manière constructive, si possible) cette façon de faire, car je ne me suis basé que sur mon expérience avec le php et le web en général pour en arriver là.
    Si il faut des bouts de code, dites-le, je les fournirais. Y'a pas de license sur mes pages.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.