8768 sujets

Développement web côté serveur, CMS

Bonjour à tous
Il existe en PHP une fonction exec($funcCall) qui permet d'exécuter une fonction donnée sous forme d'une chaîne de caractères.
Malheureusement cette fonction est désactivée sur mon serveur pour des raisons évidentes de sécurité.
Pour contourner cela, j'ai besoin d'analyser la chaine de caractères et de la transformer en un objet

class FunctionCall {
    var $command = '';
    var $arguments = array();
    function __construct($funcCall) {
       ..........................
       ..........................
       ..........................
    }


Mon problème:
les paramètres d'appel sont des chaines de caractères protégées par addslashes.
Je n'arrive pas à analyser cette chaine de caractères simplement avec des expressions régulières, ce qui serait cependant une façon pratique de le faire. Je pense donc me résoudre à l'analyser caractère par caractère, mais avant de me lancer dans cette opération, je voudrais savoir si vous n'auriez pas dans votre boite à outils un bout de code qui sache faire ça.

Merci de votre aide.
Salut Papy Smiley cligne

déjà as tu regardé si passthru ou system sont disponible ?? ce sont deux autres fonctions qui font sensiblement la même chose Smiley cligne

ensuite j'ai trouvé ça sur le web -> ici

et enfin... comment se fait il que tu ais besoin d'exec ??? c'est quand même très très rare d'avoir besoin de exec sur un porgramme web :s

peut être que si tu nous expose ce que tu veux faire on pourrait te trouver une autre solution ..

@ +
Merci de ta réponse
En fait je n'ai pas vraiment besoin d'exec, j'avais imaginé d'utiliser exec pour analyser les arguments.
Par exemple si j'ai une chaine de caractères représentant un appel à une fonction:
 mafonction('premier paramètre', "deuxième paramètre", 12345, "c\'est fini!")

Je veux obtenir un objet qui a pour propriétés:
$this -> command = 'mafonction';
$this -> arguments = array(
        'premier paramètre',
        "deuxième paramètre",
        12345,
        "c\'est fini!"

il n'est pas facile d'obtenir un tableau des arguments par expressions régulières.

J'avais donc conçu l'approche suivante:
1) je trouve le nom de la fonction par expression régulière
2) je remplace ce nom de fonction par "analyse"
3) je fais exec du résultat, ce qui appelle la fonction analyse(), laquelle rend bêtement la liste de ses arguments dans un tableau.

Finalement, j'ai tout bonnement fait un programme qui analyse la chaine de caractères caractère par caractère, et ce n'est pas si pénible que j'imaginais.

Maintenant si la question est "pourquoi veux tu analyser ce genre de chaine de caractères"? la réponse est la suivante:
1) je dois analyser en PHP une page HTML ancienne et en faire une nouvelle en jouant sur le DOM
2) parmi les balises à analyser, il y a des <script> qui contiennent des appels à des fonctions, et j'ai besoin d'analyser ces appels pour les transformer en autre chose à partir du nom de la fonction et ses arguments, par exemple appeler une autre fonction JS avec seulement certains des arguments.
Comme les appels de fonction sont quasiment identiques entre JS et PHP (tant qu'on n'utilise pas de JSON) ça aurait pu marcher si...
Modérateur
a écrit :
J'avais donc conçu l'approche suivante:
1) je trouve le nom de la fonction par expression régulière
2) je remplace ce nom de fonction par "analyse"
3) je fais exec du résultat, ce qui appelle la fonction analyse(), laquelle rend bêtement la liste de ses arguments dans un tableau.

Cela aurait pu fonctionner, mais avec «eval», et non «exec». (exec permet d’exécuter un programme externe, donc grosso-modo d’exécuter la ou les commandes passée en ligne de commande).
Cela dit, outre le JSON, n'importe quel paramètre évalué pose problèmes:

maFonction(maVariable, maVariable2.join('test'), window.getElementById('truc'), 'un texte' + ' et la suite');


La Regex nécessite un peu de temps, mais me semble plus solide. Ou alors utiliser carrément une lib de parsing de javascript