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

  1. #1
    Membre confirmé
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    373
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 373
    Points : 512
    Points
    512
    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 éclairé

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    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é...
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  3. #3
    Membre confirmé
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    373
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 373
    Points : 512
    Points
    512
    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 éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    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 confirmé
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    373
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 373
    Points : 512
    Points
    512
    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 éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    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.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Ça n'existe plus le Lua en PECL
    y'a un fork ici : http://phplua.3uu.de/

  8. #8
    Membre confirmé
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    373
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 373
    Points : 512
    Points
    512
    Par défaut pas de bol
    soit les liens sont antediluviens et ne marchent plus, genre de 2008 et plus rien, (deja ) ne marche ou c'etait du bricolage, ou alors, à l'inverse, on s'apercoit que apache va inclure un mod_lua mais que lui n'est pas encore mure.
    donc, for this time, wait and see.

    l'idée est tres plaisante, mais finalement, ca demande beaucoup, beaucoup trop de boulot tout seul pour un resultat non garanti, et une stabilité aleatoire pour le moment.

    de plus, si on laisse ce genre de choses à l'utilisateur, il va croire qu'il peut se passer de l'administrateur..
    donc, on va ecrire et administrer des scripts.. voila, ca paiera les factures..

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    Par défaut
    l'idée est tres plaisante, mais finalement, ca demande beaucoup, beaucoup trop de boulot tout seul pour un resultat non garanti, et une stabilité aleatoire pour le moment.
    Ouais parce que les eval de code utilisateur c'est la garantie d'un site sécurisé peut être ? Mettre du Lua c'est sûrement compliqué à mettre en place mais au moins on limite la problématique de sécurité.

    Sinon tu peux toujours mettre l'interprêteur Lua sur ton serveur et l'appeller avec exec (ou créer ta propre PECL si tu sais faire).

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