IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] faille php que j'ai fait


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Par défaut [POO] faille php que j'ai fait
    Bonjours à tous,

    j'ai trouvé utile de poster cette discution car bon nombre d'entre nous ont fait, fait ou feront cette erreur.

    Dans un de mes post http://www.developpez.net/forums/sho...d.php?t=510537 j'ai conseillé à un membre de ce forum d'inclure des pages dans sont index.php par la mêthode GETS.
    ex :
    Avec URL .
    Donc mon index.php j'avais :Un beau jour, j'avais un entretien d'embauche pour webmaster/webdesigner. Content d'un de mes sites, j'ai voulu le montrer. Et là surprise, ils ont vu mon site mais version hacker. L'hebergeur de ce site m'a averti le même jour par ce message
    mails sent in week 12 : 40001
    . Vous l'avez bien compris, 40001 spam envoyé depuis mon site. de ces c***** qui em***** le monde.

    Bref, le problème c’est que php peut inclure n’importe quoi, et même des fichiers distants. Donc si quelqu’un appelle l’URL :Le “?” final sert à faire tomber le “.php” dans notre include.
    Le contenu du fichier “scriptMechant.txt” sera interprété et exécuté localement (sur votre serveur). Donc le pirate peut tout faire, comme lister les fichiers, les modifier ou effacer.

    Pour eviter ce genre d'attaque, il faut filtrer ce qui passe dans la variable "$page" dans mon exemple. Il faut faire une liste de fichier à autorisé l'inclure.

    Ma methode de 1er secour était de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $pagevrai="";
    //A rajouter à chaque nouveau fichier à inclure
    if($page=="monfichier1") $pagevrai=$page;
    if($page=="monfichier2") $pagevrai=$page;
    ...
    if($page=="") $pagevrai="intro";
    //Si "$page" non vide ou mauvaise  "$page" alors afficher erreur 
    if($page!=$pagevrai) $pagevrai="erreur";
     
    include ($pagevrai".".php");
    cet article http://maconnect.ch/bg/?p=8 propose d'autres solutions et donne des détails sur ce type de faille.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Salut,

    il y aquelques règles de base à respecter absolument. L'un d'entre eux : ne jamais faire confiance à ce qui provient de l'extérieur. Y compris les requête Get / Post.
    Ensuite, au lieu d'indiquer directement les noms des fichiers à inclure dans la requête, on peut par exemple attribuer un id à chaque page. Au lieu d'avoir :
    tu auras
    Cette correspondance, très simple à réaliser avec une bdd ou même un simple fichier, t'évite 1) d'indiquer au monde entier que tu inclus des pages dans ton script; et 2) de bloquer automatiquement toute inclusion de fichiers distants. Tu peux même filtrer le champ 'id' pour que ça soit un entier uniquement, par ex, et rejeter tout 'id' qui ne soit pas entier.
    Tu peux également faire de l'url rewriting, et au lieu d'avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monsite/index.php?page=macategorie&valeur1=7523
    tu auras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monsite/macategorie/7523.html
    Résultat: pour le pirate, tout site sera un site statique, donc sans intérêt pour son script.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Par défaut
    Peux tu m'en dire plus sur l'url rewriting ?

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Je pourrais, mais sans doute pas mieux que ça :
    http://apache.developpez.com/cours/?...s#urlrewriting

    Ces trois cours devraient répondre à toutes tes questions.

  5. #5
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    sans passer par des ID numeriques, que personnellement je n'aime pas du tout pour les raisons suivantes :
    * URL qui ne ressemble a rien
    * Certains robots de moteurs de recherche n'indexent pas les pages ayant des id numeriques
    * Prise de tete pour faire un lien vers la page ("attend... cette page c'est le numero... 5789 ! A moins que ce soit 5788 ?")

    on peut tres bien indiquer le nom de la page en respectant quelques regles simples :

    * Interdire FORMELLEMENT tout les caracteres sensibles, on peut meme n'autoriser que l'alphanumerique.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $aListeUtilises = array_keys(count_chars($_GET['page'], 1));
    $aListeInterdit = explode('@', chunk_split(":/.?&", 1, '@'));
    if (count(array_intersect($aListeUtilises, $aListeInterdit)) > 0) {
      die("Non non non, tu ne me pirateras pas ^^");
    }
    Cela permet deja d'éviter de charger des URL distantes.
    A noter que l'on peut aussi modifier la variable de configuration allow_url_fopen pour éviter ca.

    * Valider le contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $aListePagesAutorisees=array(
    "index",
    "liens",
    "contacts",
    );
     
    if (!in_array($_GET['page'], $aListePagesAutorisees)) {
      die('Non plus !');
    }
    Enfin, tu as aussi la possibilité d'utiliser la fonction file_exists($_GET['page'].'.php'); pour verifier que ton fichier existe bien dans l'arborescence de ton site avant de l'inclure.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Par défaut
    D'ou l'interêt de la reécriture d'url.
    Merci Tsilefy pour l'info, ça fonctionne bien et ça passe nikel pour le sitemap google.

    J'ai bien fait de poster ce sujet .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Classe PHP super simple Mais j'y arrive pas
    Par mulbek dans le forum Langage
    Réponses: 10
    Dernier message: 17/03/2006, 15h33
  2. [POO] POO et PHP
    Par toure32 dans le forum Langage
    Réponses: 2
    Dernier message: 17/12/2005, 00h37
  3. [POO] Env PHP 5
    Par yanis97 dans le forum Langage
    Réponses: 8
    Dernier message: 09/11/2005, 17h16
  4. Réponses: 3
    Dernier message: 13/10/2005, 11h31
  5. Qu'est-ce que c'est que Nessus, ça fait quoi exactement ?
    Par PeterT dans le forum Développement
    Réponses: 3
    Dernier message: 24/07/2002, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo