2008-10-02 6 views
21

J'essaye de générer du code à l'exécution où je mets des trucs de plaque de chaudière et l'utilisateur est autorisé à entrer le code de travail réel. Mon code passe-partout ressemble à ceci:Comment mettre {et} dans une chaîne de format

using System; 

public class ClassName 
{ 
    public double TheFunction(double input) 
    { 
     // user entered code here 
    } 
} 

Idéalement, je pense que je veux utiliser string.Format pour insérer le code d'utilisateur et créer un nom de classe unique, mais je reçois une exception sur la chaîne de format à moins il ressemble à ceci:

string formatString = @" 
using System; 

public class ClassName 
{0} 
    public double TheFunction(double input) 
    {0} 
     {2} 
    {1} 
{1}"; 

J'appelle string.Format comme ceci:

string entireClass = string.Format(formatString, "{", "}", userInput); 

cela est bien et je peux faire face à la laideur de l'utilisation de {0} et {1} dans le format chaîne à la place de mon accolades sauf que maintenant mon entrée utilisateur ne peut pas utiliser des accolades non plus. Y at-il un moyen d'échapper les accolades dans ma chaîne de format, ou un bon moyen de transformer les accolades dans le code de l'utilisateur en {0} et {1}? BTW, je sais que ce genre de chose est un problème de sécurité en attente de se produire, mais il s'agit d'une application Windows Forms à usage interne sur les systèmes qui ne sont pas connectés au réseau, donc le risque est acceptable dans cette situation.

+0

C'est un problème de sécurité car le code qu'un utilisateur peut exécuter peut être littéralement n'importe quoi, pas parce qu'il est connecté au réseau. – MusiGenesis

+0

En fait non, juste parce que le code pourrait être quelque chose ne donne pas à l'utilisateur la possibilité de faire quelque chose qu'il ne pouvait pas faire auparavant. L'application fonctionne dans le même contexte que l'utilisateur et seule une personne ayant accès à la machine sur laquelle elle s'exécute peut introduire du code. –

Répondre

5

"{{" et "}}"

1

Double accolades: string.Format("{{ {0} }}", "Hello, World"); produirait { Hello, World }

5

Qu'est-ce que Je pense que vous voulez est-ce ...

string formatString = @" 
using System; 

public class ClassName 
{{ 
    public double TheFunction(double input) 
    {{ 
     {0} 
    }} 
}}"; 

string entireClass = string.Format(formatString, userInput); 
0

Soyez extrêmement prudent lorsque vous avez accès à l'application. Une meilleure solution pourrait être de créer un simple analyseur qui n'attend que quelques commandes limitées.

+0

Oui, il n'y aura que 5 ou 6 personnes qui auront des raisons d'utiliser cette application alors comme je l'ai dit, le risque est très acceptable. –

Questions connexes