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 :

Eval Try Catch [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Eval Try Catch
    Bonjour,

    J'ai ce bout de code que j'ai copié depuis un sujet résolu et que j'ai arrangé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
    	if(!@eval($expr))
    		throw new exception('parse error on $expr with eval');
    } catch(Exception $e) {
    	return false;
    }
    Le but est :
    - quand la fonction eval fonctionne, ne rentre pas dans le catch;
    - sinon, rentres-y.

    Le souci, c'est que le script rentre tout le temps dans catch. Comme je ne connais pas le fonctionnement du @, j'ai du mal a percer l'erreur du code.

    Donc, si quelqu'un aurait la gentillesse de m'éclairer...
    Merci !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le @ sert a cacher les erreurs.
    Mais je ne pense pas que ton problème vienne de là : eval() ne retourne pas d'erreurs quand le code n'est pas bon, juste FALSE.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Déjà merci pour l'explication du @.

    Je viens de découvrir que eval renvoie null s'il n'y a pas d'erreur, et false effectivement s'il y en a.

    Du coup l'idée serait de différencier null et false. Pas terrible mais je vais tester...

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pour differencier :

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Pas mal du tout ! Merci

  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
    @eval() = satan² !

    Si vraiment (c'est à dire, contraint sous la menace avec un flingue dans la bouche et deux kilos de C4 à la ceinture) on te force à utiliser eval(), la meilleure façon de procéder serait selon moi la suivante:

    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
    set_error_handler(function () use (& $err) {
        // on va éviter d'avoir les erreurs qui "remontent"
        $err = true;
    });
     
    try {
        $err = false;
        $res = eval($foobar); // attention $res peut contenir la valeur de return dans l'eval
     
        if ($err)
            throw new EvalErrorException($foobar);
    }
    catch (EvalErrorException $e) {
        // une erreur s'est produite dans l'eval
    }
    catch (Exception $e) {
        // une exception s'est produite dans l'eval
    }
     
    restore_error_handler();

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    D'après la doc il n'est pas possible d'attraper les erreurs mais j'ai peut être mal compris la réference.

  8. #8
    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
    Pourtant ça marche:
    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
    <?php
     
    ini_set('error_reporting', -1);
    ini_set('display_errors', 1);
    ini_set('html_errors', 0);
     
    $php = <<< EOPHP
     
    trigger_error('foobar', E_USER_WARNING);
     
    return true;
     
    EOPHP;
     
    set_error_handler(function () use (& $errors) { $errors[] = func_get_args(); });
     
    // aucune erreur ne s'affiche...
    $result = eval($php);
     
    restore_error_handler();
     
    var_dump( $result, count($errors) ); // true, int(1)
    Enjoy

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Hey !

    J'ai finalement résolu mon soucis en utilisant ceci (merci encore) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(eval($expr) === false)
    	return false;
    Il ne me renvoie pas d'erreur et fait exactement ce que je voulais.

    Quand au pourquoi de l'utilisation de eval, et bien disons que transformer un fonction booléenne "humaine" en fonction booléenne utilisable par php, puis l'exécuter avec eval, c'est ce que j'ai trouvé de plus pratique...

    Merci encore pour votre aide !

  10. #10
    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
    ???

    J'espère que c'est pas public au moins...

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Vous voulez dire que c'est dangereux d'utiliser eval sur du code entré par l'utilisateur ?

    Sachant que j'ajoute un $ devant chaque lettre, que je remplace les . par des && et les + par des ||, et que je prévois d'utiliser htmlentities, je vois pas trop comment ça peut être risqué...

    Après je suis débutant en php, donc je peux me tromper.

  12. #12
    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
    Vous voulez dire que c'est dangereux d'utiliser eval sur du code entré par l'utilisateur ?
    Noooooon, penses-tu.

    Sachant que j'ajoute un $ devant chaque lettre, que je remplace les . par des && et les + par des ||, et que je prévois d'utiliser htmlentities, je vois pas trop comment ça peut être risqué...
    htmlentities ça résoud pas tous les problèmes. Quelqu'un de malin aura vite compris ton encodage et ne manquera pas de l'exploiter.

    A noter; il ne faut qu'une ligne de code pour créer une backdoor dans une appli PHP, tu devrais y réfléchir

  13. #13
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Vous voulez dire que c'est dangereux d'utiliser eval sur du code entré par l'utilisateur ?
    Non, mais il faut prévoir une case à cocher certifiant que l'utilisateur est gentil :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <label><input type="checkbox" name="je_suis_gentil" value="oui" /> En cochant cette case, je certifie être gentil et ne pas poster de code méchant.</label>


  14. #14
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    J'ai bien aimé le coup de la checkbox ^^

    Certes maintenant je suis convaincu... cependant en attendant mieux, et étant donné que ce n'est pas encore public (pas référencé du moins), ça restera comme ça.

    L'idée, plus tard, quand je voudrais vraiment le rendre accessible et sécurisé, ce serait donc d'éviter d'utiliser eval (ce qui me fait passer par un arbre pour extraire les variables, opérations binaires, et tenir compte des parenthèses).

    Mais encore ? Il doit exister des techniques pour rendre le code inoffensif non ? Détecter la présence d'éléments susceptibles de créer une faille (balises php, instructions, ...).

    Je suis sûr qu'il existe des réponses sur le web, mais vous semblez assez experts, et vous avez un humour assez décapant ^^

    PS : Je ne pense pas l'avoir dit explicitement mais la partie du site qui concerne ce sujet sert à entrer une fonction booléenne, qui est par la suite passée par la table de vérité, la table de Karnaugh et simplifiée.

  15. #15
    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
    Personnellement, si je devais fournir la possibilité à mes utilisateurs de scripter quelque chose coté serveur, j'utiliserai du JavaScript avec v8js

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

Discussions similaires

  1. Problème avec eval et try/catch
    Par kracter56 dans le forum MATLAB
    Réponses: 1
    Dernier message: 20/11/2012, 06h46
  2. __try __finally et try catch
    Par buzzz dans le forum C++
    Réponses: 6
    Dernier message: 19/02/2005, 15h31
  3. [debutant sous eclipse] surround with try catch
    Par Alwin dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 26/06/2004, 20h03
  4. [try-catch] relancer les instruction du bloc try
    Par nounou dans le forum Langage
    Réponses: 11
    Dernier message: 12/05/2004, 11h23
  5. Exception & Try..catch
    Par PurL dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/12/2002, 15h35

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