Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/03/2011, 17h17   #1
Membre actif
 
christian
Développeur indépendant
Inscription : août 2004
Messages : 251
Détails du profil
Informations personnelles :
Nom : christian
Âge : 43
Localisation : France

Informations professionnelles :
Activité : Développeur indépendant
Secteur : Transports

Informations forums :
Inscription : août 2004
Messages : 251
Points : 184
Points : 184
Par défaut securiser et limiter la portée d'un eval

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.
Code :
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;
    }
  }
}
?>
et le contenu de testparsephp1.php
Code :
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;
 
?>
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 ??
eomer212 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 17h52   #2
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
Tu peux essayer de jouer avec les propriétés de php.ini avec ini_set() :
  • disable_classes
  • disable_functions

A voir si tu peux interdire l'utilisation de la fonction ini_set() elle-même... Mais chaud ton truc. Débrouille toi aussi pour rendre indisponible toute connexion à ta BDD dans le script qui exécute le code stocké...
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 16/03/2011, 18h32   #3
Membre actif
 
christian
Développeur indépendant
Inscription : août 2004
Messages : 251
Détails du profil
Informations personnelles :
Nom : christian
Âge : 43
Localisation : France

Informations professionnelles :
Activité : Développeur indépendant
Secteur : Transports

Informations forums :
Inscription : août 2004
Messages : 251
Points : 184
Points : 184
Par défaut hum,, oui, peut etre

sauf que dans le cas actuel, je peux pas limiter l'execution du service php lui meme, car il abrite le reste de mon code actif, session, etc..
c'est justement pour ca que je veux 'filtrer' et valider/interdire le code qui pourrait etre evalué.

mais, je suis en train de voir pour faire cette validation à l'enregistrement,
de facon à verifier la presence de strings comme par exemple mysql_connect, eval, ou autres joyeusetes telles que la modification des variables php ou de sessions..

et faire la liste des strings interdits en fait..

sinon, si je veux realiser un systeme de scripts definissables par l'utilisateur, je serais obligé de sortir l'artillerie lourde, flex et yacc..
ca m'emmerderais un peu soit dit en passant, mais s'il le faut vraiment, je le ferais..
mais avant, comme je suis un feneant intelligent je cherche la solution de feneant, des fois, ca marche bien..
eomer212 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 18h38   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Citation:
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.
DANGER !

Une solution élégante, en plus de ton système de restriction, serait peut être de construire des scripts php temporaires, exécutés séparément du site lui-même et donc l'output produit, récupérés sous forme de chaine de caractères serait renvoyé à l'utilisateur final. Cela permettrait d'isoler le code et d'éviter les débordements. Mais en aucun cas cela ne sécuriserait totalement la plateforme.

Pour moi, ce que tu cherches à faire est vraiment la dernière des choses à faire.

Citation:
donc, je voudrais pouvoir autoriser seulement une partie des operations du PHP.
Pourquoi ne pas proposer à l'utilisateur d'utiliser un langage simple que tu définis toi-même ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 19h01   #5
Membre actif
 
christian
Développeur indépendant
Inscription : août 2004
Messages : 251
Détails du profil
Informations personnelles :
Nom : christian
Âge : 43
Localisation : France

Informations professionnelles :
Activité : Développeur indépendant
Secteur : Transports

Informations forums :
Inscription : août 2004
Messages : 251
Points : 184
Points : 184
Par défaut definition d'un langage

oui, ca parait evident qu'il faudrait redefinir un langage..
mais flex et yacc me font un peu peur vu que j'ai jamais eu de cours la dessus, comme de cours en infos dignes de ce nom d'ailleurs.. donc quelques manques qui me genent.. et me font craindre le pire concernant l'investissement en temps necessaire pour arriver à sortir quelque chose de fonctionnel..
si tu me disais que quelqu'un a fait quelque chose d'approchant, ca m'aiderait beaucoup, et avec un lien qui marche, ca serait top..
eomer212 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 19h42   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Citation:
mais flex et yacc me font un peu peur vu que j'ai jamais eu de cours la dessus, comme de cours en infos dignes de ce nom d'ailleurs
Et tu as bien raison, j'ai des souvenirs de mes cours de compilation et c'est vrai que faire un vrai langage "from scratch" c'est pas de la tarte.

Enfin un langage tout bête du style de brainfuck s'implémente en 2 heures

Citation:
si tu me disais que quelqu'un a fait quelque chose d'approchant, ca m'aiderait beaucoup, et avec un lien qui marche, ca serait top..
Heu là j'ai rien qui me vient, je vais peut être trouver quelque chose du coté de Lua...

-- EDIT

Ah bah justement je croyais pas si bien dire: http://pecl.php.net/package/lua
Lua est à l'origine un langage de script léger et (très) performant destiné à être intégré dans une application plus importante. Il est très utilisé dans le jeu vidéo (pour la console par exemple) notament dans WoW.

C'est, je pense, la solution à ton problème.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 20h29   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
Ça n'existe plus le Lua en PECL
y'a un fork ici : http://phplua.3uu.de/
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 01h37   #8
Membre actif
 
christian
Développeur indépendant
Inscription : août 2004
Messages : 251
Détails du profil
Informations personnelles :
Nom : christian
Âge : 43
Localisation : France

Informations professionnelles :
Activité : Développeur indépendant
Secteur : Transports

Informations forums :
Inscription : août 2004
Messages : 251
Points : 184
Points : 184
Par défaut pas de bol

soit les liens sont antediluviens et ne marchent plus, genre de 2008 et plus rien, (deja ) ne marche ou c'etait du bricolage, ou alors, à l'inverse, on s'apercoit que apache va inclure un mod_lua mais que lui n'est pas encore mure.
donc, for this time, wait and see.

l'idée est tres plaisante, mais finalement, ca demande beaucoup, beaucoup trop de boulot tout seul pour un resultat non garanti, et une stabilité aleatoire pour le moment.

de plus, si on laisse ce genre de choses à l'utilisateur, il va croire qu'il peut se passer de l'administrateur..
donc, on va ecrire et administrer des scripts.. voila, ca paiera les factures..
eomer212 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 10h43   #9
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Citation:
l'idée est tres plaisante, mais finalement, ca demande beaucoup, beaucoup trop de boulot tout seul pour un resultat non garanti, et une stabilité aleatoire pour le moment.
Ouais parce que les eval de code utilisateur c'est la garantie d'un site sécurisé peut être ? Mettre du Lua c'est sûrement compliqué à mettre en place mais au moins on limite la problématique de sécurité.

Sinon tu peux toujours mettre l'interprêteur Lua sur ton serveur et l'appeller avec exec (ou créer ta propre PECL si tu sais faire).
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h11.


 
 
 
 
Partenaires

Hébergement Web