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

C# Discussion :

évaluation d'une expression mathématique (sans compilation à la volée)


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 17
    Par défaut évaluation d'une expression mathématique (sans compilation à la volée)
    Bonjour,

    dans le cadre de mon travail, j'ai développé une calculette qui utilise les réseaux de Petri pour créer des expressions mathématique au format string "(45 + 6.5) * 2 - 8 * (9 + 11)".

    J'arrivais à évaluer cette expression en utilisant les classes CSharpCodeProvider, la réflection...

    Sauf que finalement, il m'est absolument interdit de compiler à la volée dans les applications web .NET et je ne peux pas utiliser les appels à CompileAssemblyFrom* de vos sources C#.

    J'ai besoin de votre aide si vous savez où je peux trouver une source qui permet de gérer cette évalution d'expression arithmétique.

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 17
    Par défaut
    Sur plusieurs sites étrangers, ils proposent d'utiliser la méthode Eval du Javascript :

    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
    ---- Math.js -----------
    class JsMath
    {
    static function Eval(MathExpression : String) : double
    {
    return eval(MathExpression);
    };
    }
    ------ Test.cs ----------
    using System;
    using System.Text;
     
    class Test
    {
    static void Main(string[] args)
    {
    System.Console.WriteLine(JsMath.Eval("(1 + 2) * 8"));
    }
    }
    ----------------------
    jsc /t:library Math.js
    csc -r:Microsoft.JScript.dll -r:Math.dll test.cs
    Je vais regarder ce que cela donne. Même si je préférai avoir un analyseur C#.

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Citation Envoyé par louvinon Voir le message
    Bonjour,

    dans le cadre de mon travail, j'ai développé une calculette qui utilise les réseaux de Petri pour créer des expressions mathématique au format string "(45 + 6.5) * 2 - 8 * (9 + 11)".

    J'arrivais à évaluer cette expression en utilisant les classes CSharpCodeProvider, la réflection...

    Sauf que finalement, il m'est absolument interdit de compiler à la volée dans les applications web .NET et je ne peux pas utiliser les appels à CompileAssemblyFrom* de vos sources C#.

    J'ai besoin de votre aide si vous savez où je peux trouver une source qui permet de gérer cette évalution d'expression arithmétique.

    Merci
    Dans le framework Spring, il y a un assemblage d'expressions qui se base sur antlr.
    Ici.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par louvinon Voir le message
    Sauf que finalement, il m'est absolument interdit de compiler à la volée dans les applications web .NET
    Ah bon ? tu es sur ? même si c'est le cas, une solution très simple dans ce cas est de mettre un service à coté qui exposera une méthode ayant en entrée la formule et le résultat en sortie, fera cette compilation à la volée, exécutera la méthode compilée et retournera le résultat à ton web service.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Ah bon ? tu es sur ? même si c'est le cas, une solution très simple dans ce cas est de mettre un service à coté qui exposera une méthode ayant en entrée la formule et le résultat en sortie, fera cette compilation à la volée, exécutera la méthode compilée et retournera le résultat à ton web service.
    Non, il faut surtout pas utiliser la compilation à la volée si c'est l'utilisateur qui saisit la formule... il pourrait mettre n'importe quel code C# qui serait compilé et exécuté sur le serveur !!! C'est une monstrueuse faille de sécurité !

    La solution avec le eval de javascript est sympa, j'aurais pas pensé...

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Non, il faut surtout pas utiliser la compilation à la volée si c'est l'utilisateur qui saisit la formule... il pourrait mettre n'importe quel code C# qui serait compilé et exécuté sur le serveur !!! C'est une monstrueuse faille de sécurité
    N'exagérons pas. Il ne peut pas faire appel à des Assembly externes que tu n'as pas spécifiés. Cela restreint considérablement la portée de ton affirmation.

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Oui mais sur son domaine APS il ne pourra de toute façon pas utiliser CodeDom sans demander un niveau full trust de la part de l'assembly appellante et de son domaine d'application.

    Donc même si tu as raison sur le fait que cela puisse ne pas être une faille de sécurité au sens décrit, c'en est une au niveau application.

    C'est quasiment impossible de faire un site ASP.NET fulltrust.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    N'exagérons pas. Il ne peut pas faire appel à des Assembly externes que tu n'as pas spécifiés. Cela restreint considérablement la portée de ton affirmation.
    Ben avec juste une référence à mscorlib (obligatoire, sinon tu peux rien faire...) tu peux déjà faire pas mal de dégâts... ça permet d'accéder aux fichiers, à la base de registre...

    Evidemment, si c'est du web, l'application tourne avec un jeu de permissions plus restreint, mais le danger est quand même loin d'être nul...

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ben avec juste une référence à mscorlib (obligatoire, sinon tu peux rien faire...) tu peux déjà faire pas mal de dégâts... ça permet d'accéder aux fichiers, à la base de registre...

    Evidemment, si c'est du web, l'application tourne avec un jeu de permissions plus restreint, mais le danger est quand même loin d'être nul...
    Si tu pars du principe que tu ne le mets pas a priori dans ton application mais dans un service à part, tu peux restreindre énormément les permissions, et factuellement bloquer toutes les actions potentiellement dommageables.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 17
    Par défaut
    Oui BAF, j'ai regardé pour le framework SPRING mais je pense pas être autorisé à l'employer. Je bosse au sein d'un organisme financier.

    L'utilisation de la fonction Eval en Javascript marche très bien, mais il faut que je vois si je suis autorisé d'insérer une telle dll dans le projet.

    J'aurai aimé trouver un développement d'analyseur c# qui convertisse simplement un string en résultat décimal.

  11. #11
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Citation Envoyé par louvinon Voir le message
    Oui BAF, j'ai regardé pour le framework SPRING mais je pense pas être autorisé à l'employer. Je bosse au sein d'un organisme financier.

    L'utilisation de la fonction Eval en Javascript marche très bien, mais il faut que je vois si je suis autorisé d'insérer une telle dll dans le projet.

    J'aurai aimé trouver un développement d'analyseur c# qui convertisse simplement un string en résultat décimal.
    Je sais bien, mais spring est open source, donc tu as les sources, donc tu peux reprendre le moteur d'évaluation

  12. #12
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Ah bon ? tu es sur ? même si c'est le cas, une solution très simple dans ce cas est de mettre un service à coté qui exposera une méthode ayant en entrée la formule et le résultat en sortie, fera cette compilation à la volée, exécutera la méthode compilée et retournera le résultat à ton web service.
    Si et seulement si full trust.

    [PermissionSet(SecurityAction:emand, Name="FullTrust")] ==> Permissions du codedom (qu'il va utiliser pour faire son évaluation)

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

Discussions similaires

  1. Évaluation d'une expression conditionnelle
    Par Evocatii dans le forum Langage
    Réponses: 2
    Dernier message: 05/08/2007, 13h27
  2. Evaluer une expression mathématique
    Par sbeu dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/07/2007, 18h28
  3. Réponses: 2
    Dernier message: 20/11/2006, 21h19
  4. Analyser une expression mathématique
    Par Amokrane dans le forum C++
    Réponses: 5
    Dernier message: 06/01/2006, 13h36
  5. Réponses: 10
    Dernier message: 18/11/2004, 23h12

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