Bonjour,
J'aimerais permettre aux administrateurs d'une application PHP de configurer certaines méthodes de calculs, ou, autrement dit, de définir eux même quelques fonctions en PHP.
Par exemple, on pourrait imaginer que la méthode pour calculer certains coûts change régulièrement et calculerCouts() passe régulièrement de :
à
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 function calculerCouts($qt) { $prixUnitaire = 0.5; return $qt * $prixUnitaire; }
Et je voudrais donc que ça soit les administrateurs qui rentrent ces fonctions via une interface.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 function calculerCouts($qt) { if ($qt < 100) $prixUnitaire = 0.5; } else { $prixUnitaire = 0.3; } return $qt * $prixUnitaire; }
PHP met à disposition des fonctions pour interpréter du code depuis une chaîne de caractères comme eval() ou encore create_function(). Seulement voilà, ça me pose problème d'utiliser eval($_POST['ma_fonction']).
Ce n'est pas une question de sécurité. Bien sûr que ça n'est pas sécure mais il s'agit d'une application intranet et de plus les utilisateurs qui auraient la possibilité de définir les fonctions sont admins et peuvent donc tout casser sans cette fonctionnalité.
Non ce qui pose problème c'est que même sans mauvaises intentions, il est possible de perturber l'application avec, par exemple, des erreurs de syntaxe, des boucles infinies, de l'affichage, ou bien en étant pessimiste, une faute de frappe qui fait system('rm -rf /').
Bref tout ça pour dire que je cherche une solution pour permettre aux utilisateurs de saisir des fonctions de manière sécurisée.
J'imagine deux méthodes possibles : exécuter le code dans une sandbox ou bien alors utiliser un autre langage simple et très limité.
Pour la deuxième solution je me demandais s'il existait pas déjà, à votre connaissance, des bibliothèques PHP interprétant un langage simple avec une liste de blanche de fonctions autorisées (pour limiter les accès au système de fichiers ou à la BDD). Parce que bon, je me vois pas créer un parser et tout.
Même chose pour les sandboxs, je n'ai jamais utilisé ce genre de choses.
Donc en gros je cherche quelqu'un qui pourrait me mettre sur une piste. Le mieux serait un retour d'une personne ayant déjà mis en place ce genre de fonctionnalité.
Merci d'avance pour votre aide.
Partager