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 :

securiser et limiter la portée d'un eval


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    377
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 377
    Par défaut securiser et limiter la portée d'un eval
    contexte: je voudrais pouvoir donner aux utilisateurs la possibilité de mettre leurs propres scripts php, stockés dans une base de données et evalués quand on en a besoin, donc executés.
    l'optique est de pouvoir programmer des operations simple, texte ou calcul à la demande en autorisant ou interdisant un script selon les token qu'il contient.

    probleme, quand le script est fait par le webmaster, on peut l'evaluer, même si au depart, je suis pas trés chaud pour l'eval.ca me fait toujours peur au niveau de la securité.
    donc, je voudrais pouvoir autoriser seulement une partie des operations du PHP.
    pour ce faire, j'ai déja regardé vers token_get_all() pour parser le source.
    maintenant, à partir de ca, je voudrais pouvoir verifier la presence ou non de token ou de fonctions interdites.(à définir) ou plutot valider les seules fonctions autorisées.

    pour ce faire, je suis deja arrive au decoupage des token à partir d'une source.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php
    /* T_ML_COMMENT n'existe pas en PHP 5.
    * Les trois lignes suivantes définissent l'ordre 
    * pour préserver une compatibilité ascendante.
    *
    * Les deux lignes suivantes la constante T_DOC_COMMENT uniquement présente en PHP 5,
    * que nous appelerons T_ML_COMMENT pour PHP 4.
    */
    if (!defined('T_ML_COMMENT')) {
      define('T_ML_COMMENT', T_COMMENT);
    } else {
      define('T_DOC_COMMENT', T_ML_COMMENT);
    }
     
    echo ('debut <br>');
    $source = file_get_contents("testparsephp1.php");
    if ($source==FALSE)
    	echo("erreur fichier<br>");
    echo(htmlentities($source)."<br>");
    $tokens = token_get_all($source);
    echo($tokens."<br>");
    foreach ($tokens as $token) {
      if (is_string($token)) {
        // simple 1-character token
        echo htmlentities($token)." string <br>";
      } else {
        // token array
        list($id, $text) = $token;
        switch ($id) { 
          case T_COMMENT: 
          case T_ML_COMMENT: // nous avons définie cette constante
          case T_DOC_COMMENT: // et celle-là
            // aucune action sur les commentaires
            break;
          default:
            // rien d'autre -> affiche "as is"
            echo htmlentities(token_name($id).' => '.$text)."<br>";
            break;
        }
      }
    }
    ?>
    et le contenu de testparsephp1.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    if (isset($_POST['demandes']))
    	echo("demande set.<br>");
    $i="cou(cou";
    echo($i);
    $frd=12;
    $ref=$frd*3;
     
    ?>
    maintenant, à partir, de ca, est-ce qu'il est possible de filtrer les token simplement pour interdire un code qui voudrait modifier par exemple l'environnement, ou les variables de session par exemple, vu qu'il sera executé, ou est-ce que je dois m'orienter vers un autre moyen ??

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Tu peux essayer de jouer avec les propriétés de php.ini avec ini_set() :
    • disable_classes
    • disable_functions


    A voir si tu peux interdire l'utilisation de la fonction ini_set() elle-même... Mais chaud ton truc. Débrouille toi aussi pour rendre indisponible toute connexion à ta BDD dans le script qui exécute le code stocké...

  3. #3
    Membre très actif
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    377
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 377
    Par défaut hum,, oui, peut etre
    sauf que dans le cas actuel, je peux pas limiter l'execution du service php lui meme, car il abrite le reste de mon code actif, session, etc..
    c'est justement pour ca que je veux 'filtrer' et valider/interdire le code qui pourrait etre evalué.

    mais, je suis en train de voir pour faire cette validation à l'enregistrement,
    de facon à verifier la presence de strings comme par exemple mysql_connect, eval, ou autres joyeusetes telles que la modification des variables php ou de sessions..

    et faire la liste des strings interdits en fait..

    sinon, si je veux realiser un systeme de scripts definissables par l'utilisateur, je serais obligé de sortir l'artillerie lourde, flex et yacc..
    ca m'emmerderais un peu soit dit en passant, mais s'il le faut vraiment, je le ferais..
    mais avant, comme je suis un feneant intelligent je cherche la solution de feneant, des fois, ca marche bien..

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    contexte: je voudrais pouvoir donner aux utilisateurs la possibilité de mettre leurs propres scripts php, stockés dans une base de données et evalués quand on en a besoin, donc executés.
    DANGER !

    Une solution élégante, en plus de ton système de restriction, serait peut être de construire des scripts php temporaires, exécutés séparément du site lui-même et donc l'output produit, récupérés sous forme de chaine de caractères serait renvoyé à l'utilisateur final. Cela permettrait d'isoler le code et d'éviter les débordements. Mais en aucun cas cela ne sécuriserait totalement la plateforme.

    Pour moi, ce que tu cherches à faire est vraiment la dernière des choses à faire.

    donc, je voudrais pouvoir autoriser seulement une partie des operations du PHP.
    Pourquoi ne pas proposer à l'utilisateur d'utiliser un langage simple que tu définis toi-même ?

  5. #5
    Membre très actif
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    377
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 377
    Par défaut definition d'un langage
    oui, ca parait evident qu'il faudrait redefinir un langage..
    mais flex et yacc me font un peu peur vu que j'ai jamais eu de cours la dessus, comme de cours en infos dignes de ce nom d'ailleurs.. donc quelques manques qui me genent.. et me font craindre le pire concernant l'investissement en temps necessaire pour arriver à sortir quelque chose de fonctionnel..
    si tu me disais que quelqu'un a fait quelque chose d'approchant, ca m'aiderait beaucoup, et avec un lien qui marche, ca serait top..

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    mais flex et yacc me font un peu peur vu que j'ai jamais eu de cours la dessus, comme de cours en infos dignes de ce nom d'ailleurs
    Et tu as bien raison, j'ai des souvenirs de mes cours de compilation et c'est vrai que faire un vrai langage "from scratch" c'est pas de la tarte.

    Enfin un langage tout bête du style de brainfuck s'implémente en 2 heures

    si tu me disais que quelqu'un a fait quelque chose d'approchant, ca m'aiderait beaucoup, et avec un lien qui marche, ca serait top..
    Heu là j'ai rien qui me vient, je vais peut être trouver quelque chose du coté de Lua...

    -- EDIT

    Ah bah justement je croyais pas si bien dire: http://pecl.php.net/package/lua
    Lua est à l'origine un langage de script léger et (très) performant destiné à être intégré dans une application plus importante. Il est très utilisé dans le jeu vidéo (pour la console par exemple) notament dans WoW.

    C'est, je pense, la solution à ton problème.

Discussions similaires

  1. Limiter la portée d'une commande \ifthenelse et d'un compteur au sein d'une boite
    Par Théodulf dans le forum Programmation (La)TeX avancée
    Réponses: 7
    Dernier message: 18/04/2011, 23h11
  2. limiter la porte des variables
    Par ol9245 dans le forum MATLAB
    Réponses: 15
    Dernier message: 16/10/2009, 20h19
  3. [POO] Limiter la portée d'une variable
    Par j0o0 dans le forum Langage
    Réponses: 1
    Dernier message: 04/11/2007, 21h05
  4. Limiter la portée d'un style="clear:both"
    Par Bizen-Ya dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 05/04/2007, 16h13
  5. limiter l'ouverture des ports internets
    Par Paradam dans le forum Développement
    Réponses: 2
    Dernier message: 16/06/2003, 16h03

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