2008-10-27 5 views
1

J'ai travaillé lentement sur un projet de personnel pour exécuter un jeu comme webmud en utilisant extjs comme mon frontend. L'un des choix de conception que j'ai fait était de permettre le code évalué généré par l'utilisateur pour la logique du jeu. Ainsi, lorsque le joueur pénètre dans une nouvelle "salle", un certain nombre de scripts d'état seraient appelés comme suit: "Le joueur a-t-il déjà été là? Devrait-il être là? A-t-il un objet d'inventaire?" De plus, les «actions» de base de la pièce seraient codées en dur (aller N/S/E/W), mais les actions avancées seraient disponibles sous la forme des mêmes scripts évalués par l'utilisateur. A l'origine j'allais être fainéant et j'utilisais PHP pour cette logique, mais mon sens paranoïaque est là. Donc les deux alternatives que j'ai trouvées sont runkit_sandbox mais il ne supporte pas un échange d'objets entre le primaire thread et le bac à sable (juste des types de données simples et des tableaux) OU en utilisant ecmascript comme ma logique de jeu http://ejohn.org/blog/spicing-up-embedded-javascript/. Le pour et le contre des deux est que avec runkit, je peux verrouiller le script assez fort à un coût énorme pour accélérer alors que l'interpréteur ecma me permettrait de lier sélectivement des variables, des fonctions, et éventuellement des objets au javascript l'espace de course mais son état encore en bêta et je n'ai pas encore vu comment il fonctionne.Recommandations pour sandboxing dans PHP5 ou des alternatives?

Est-ce que c'est pour les options ou est-ce qu'il y a autre chose que je ne connais pas qui pourrait être un meilleur choix? Environnement: linux, PHP-CGI 5.3 ou en tant que moteur d'application google.

+0

J'ai développé une classe de bac à sable sous licence BSD dans ce but. Il utilise la bibliothèque PHPParser pour analyser le code en sandbox, le vérifier par rapport à des listes blanches et des listes noires configurables par l'utilisateur, et dispose d'un large éventail d'options de configuration ainsi que de paramètres par défaut sains. Le projet comprend également une boîte à outils sandbox (à utiliser uniquement sur votre machine locale!) Qui peut être utilisée pour tester les paramètres du sandbox, ainsi qu'une documentation complète sur les manuels et les API. https://github.com/fieryprophet/php-sandbox –

Répondre

4

Je ne recommanderais pas d'évaluer le code PHP de l'utilisateur - même dans un sandbox runkit. PHP est un langage très complexe, et il est étroitement lié à son environnement. Sans connaître les détails, je prévois qu'il y a de nombreux trous que les gens pourraient utiliser pour sortir du bac à sable.

Il existe d'autres langues, que vous pouvez intégrer, que javascript. Lua est un choix populaire pour ce genre de choses. Il y a même un php extension in pecl, avec des reliures pour cela.

Si vous utilisez de toute façon la route Runkit, vous pouvez consulter une solution de mémoire partagée, telle que memcache, pour échanger des données entre processus.

+0

N'avait même pas pensé à lua, en vérifiant le paquet pecl maintenant pour voir à quelle distance il se trouve. – David

+0

Malheureusement, le paquet lua pecl a l'air assez rugueux sur les bords. Il n'y a eu aucune publication et le dernier changement dans le dépôt de CVS remonte à 6 mois. – David

+0

OK - Je n'étais pas au courant de ça. Je ne sais pas si c'est réaliste pour vous, mais vous pourriez essayer de résoudre vos problèmes. Lua est célèbre pour être facile à intégrer dans le code C (quelle est une extension php), donc ça ne devrait pas être trop dur. – troelskn