contexte: je voudrais pouvoir donner aux utilisateurs la possibilité de mettre leurs propres scripts php, stockés dans une base de données et evalués quand on en a besoin, donc executés.
l'optique est de pouvoir programmer des operations simple, texte ou calcul à la demande en autorisant ou interdisant un script selon les token qu'il contient.
probleme, quand le script est fait par le webmaster, on peut l'evaluer, même si au depart, je suis pas trés chaud pour l'eval.ca me fait toujours peur au niveau de la securité.
donc, je voudrais pouvoir autoriser seulement une partie des operations du PHP.
pour ce faire, j'ai déja regardé vers token_get_all() pour parser le source.
maintenant, à partir de ca, je voudrais pouvoir verifier la presence ou non de token ou de fonctions interdites.(à définir) ou plutot valider les seules fonctions autorisées.
pour ce faire, je suis deja arrive au decoupage des token à partir d'une source.et le contenu de testparsephp1.php
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 <?php /* T_ML_COMMENT n'existe pas en PHP 5. * Les trois lignes suivantes définissent l'ordre * pour préserver une compatibilité ascendante. * * Les deux lignes suivantes la constante T_DOC_COMMENT uniquement présente en PHP 5, * que nous appelerons T_ML_COMMENT pour PHP 4. */ if (!defined('T_ML_COMMENT')) { define('T_ML_COMMENT', T_COMMENT); } else { define('T_DOC_COMMENT', T_ML_COMMENT); } echo ('debut <br>'); $source = file_get_contents("testparsephp1.php"); if ($source==FALSE) echo("erreur fichier<br>"); echo(htmlentities($source)."<br>"); $tokens = token_get_all($source); echo($tokens."<br>"); foreach ($tokens as $token) { if (is_string($token)) { // simple 1-character token echo htmlentities($token)." string <br>"; } else { // token array list($id, $text) = $token; switch ($id) { case T_COMMENT: case T_ML_COMMENT: // nous avons définie cette constante case T_DOC_COMMENT: // et celle-là // aucune action sur les commentaires break; default: // rien d'autre -> affiche "as is" echo htmlentities(token_name($id).' => '.$text)."<br>"; break; } } } ?>
maintenant, à partir, de ca, est-ce qu'il est possible de filtrer les token simplement pour interdire un code qui voudrait modifier par exemple l'environnement, ou les variables de session par exemple, vu qu'il sera executé, ou est-ce que je dois m'orienter vers un autre moyen ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <?php if (isset($_POST['demandes'])) echo("demande set.<br>"); $i="cou(cou"; echo($i); $frd=12; $ref=$frd*3; ?>
Partager