73 votes

Comment puis-je sandbox Python en pur Python?

Je suis le développement d'un jeu web en pur Python, et que vous voulez quelque script simple disponible pour permettre de renforcer la dynamique du contenu du jeu. Le contenu du jeu peut être ajouté en direct par les utilisateurs privilégiés.

Ce serait bien si le langage de script pourrait être Python. Toutefois, il ne peut pas courir avec accès à l'environnement le jeu fonctionne depuis un utilisateur malveillant pourrait faire des ravages qui serait mauvais. Est-il possible de bac à sable Python en pur Python?

Mise à jour: En fait, depuis vrai le support de Python serait bien exagéré, un langage de script simple avec Pythonic syntaxe, ce serait parfait.

Si il n'y a pas Pythonic script interprètes, il y a aucune autre source ouverte script interprètes écrite en pur Python que je pourrais utiliser? Les exigences sont un soutien pour les variables de base, les conditions et les appels de fonction (pas de définitions).

57voto

Noufal Ibrahim Points 32200

C'est vraiment non négligeable.

Il y a deux façons de sandbox Python. L'une est de créer un environnement restreint (c'est à dire, très peu de variables globales, etc.) et exec votre code à l'intérieur de cet environnement. C'est ce Messa suggère. Il est joli, mais il y a beaucoup de façons de sortir de la sandbox et de créer des ennuis. Il y avait un fil à ce sujet sur le langage Python-dev il y a un an ou deux dans lequel les gens ont fait des choses d'attraper les exceptions et les piquer à l'intérieur de l'état pour sortir de byte code de la manipulation. C'est la voie à suivre si vous voulez un langage complet.

L'autre façon est d'analyser le code et ensuite utiliser l' ast module à coup de pied des constructions vous ne voulez pas (par exemple, les instructions d'importation, les appels de fonction, etc.) et pour compiler le reste. C'est la voie à suivre si vous souhaitez utiliser Python comme langage de configuration etc.

D'une autre façon (qui pourrait ne pas fonctionner pour vous, puisque vous êtes à l'aide de GAE), est la PyPy sandbox. Alors que je n'ai pas utilisé moi-même, parole sur les intertubes, c'est que c'est la seule véritable bac à sable Python là-bas.

En fonction de votre description des exigences (Les exigences sont un soutien pour les variables de base, les conditions et les appels de fonction (pas de définitions)) , vous pourriez voulez évaluer l'approche 2 et du coup tout le reste du code. C'est un peu difficile, mais faisable.

10voto

Messa Points 5988

Autant que je sache, il est possible d'exécuter un code dans un environnement complètement isolé:

 exec somePythonCode in {'__builtins__': {}}, {}
 

Mais dans un tel environnement, vous ne pouvez presque rien faire :) (vous ne pouvez même pas import un module; mais un utilisateur malveillant peut toujours exécuter une récursion infinie ou manquer de mémoire.) Vous voudrez probablement ajouter certains modules qui seront l'interface avec votre moteur de jeu.

9voto

Sergey Points 3754

Je tiens à re-poster mon commentaire pour une question fermée comme un doublon de celui-ci: Python Python: restriction des fonctionnalités?

Je ne sais pas pourquoi personne n'en parle, mais Zope 2 a un truc qui s'appelle un Script Python, qui est exactement ce que restreint Python exécuté dans un bac à sable, sans aucun accès au système de fichier, avec l'accès à d'autres objets Zope contrôlé par Zope sécurité des machines, avec des importations limitées à un sous-ensemble sûr. Zope en général est assez fort, donc, j'imagine, il n'y a pas connue ou évidente moyens de sortir de la sandbox. Je ne suis pas sûr de savoir comment exactement les Scripts Python sont mis en œuvre, mais la fonction a été autour depuis comme l'an 2000.

Et ici est la magie de l'PythonScripts, avec une documentation détaillée: http://pypi.python.org/pypi/RestrictedPython - il ressemble même il n'a pas de dépendances sur Zope, et peut donc être utilisé de façon autonome.

Notez que ce n'est pas en toute sécurité pour l'exécution arbitraire de code python (la plupart du hasard scripts échoue sur la première importation ou d'accès au fichier), mais plutôt pour l'utilisation de Python pour limité de script dans une application en Python.

3voto

Philip T. Points 1493

Je veux le regarder dans un de deux serveurs approche. Le premier serveur est le privilège du serveur web où votre code de vie. Le second serveur est très étroitement contrôlée serveur qui fournit uniquement un service web ou un service RPC et exécute le code non fiable. Vous donnez votre créateur de contenu avec votre interface personnalisée. Par exemple si vous permettait à l'utilisateur final de créer des articles, vous avez un look qui appelle le serveur avec le code à exécuter et à l'ensemble de paramètres.

Voici et abstraite exemple pour une potion de guérison.

{function_id='healing potion', action='use', target='self', inventory_id='1234'}

La réponse pourrait être quelque chose comme

{hp='+5' action={destroy_inventory_item, inventory_id='1234'}}

1voto

Will Points 30630

Hmm. C'est une expérience de pensée, je ne sais pas de qu'il fait:

Vous pouvez utiliser l' compiler package parse le script. Vous pouvez ensuite à pied de cet arbre, la préfixation de tous les identificateurs de variables, les noms de méthode e.t.c. (également has|get|setattr des invocations et ainsi de suite) - avec un unique préambule de sorte qu'ils ne peuvent pas éventuellement référence aux variables. Vous pourriez également veiller à ce que l' compiler package lui-même n'a pas été invoquée, et peut-être d'autres sur la liste noire des choses telles que l'ouverture de fichiers. Vous puis émet le code python pour cela, et compiler.compile il.

Les docs noter que l' compiler colis n'est pas en Python 3.0, mais ne fait pas mention de ce que le 3.0 alternative.

En général, ce est parallèle à la façon dont forum software et essayez à la liste de diffusion " sûr " Javascript ou HTML.e.t.c. Et ils ont toujours un mauvais dossier de piétiner toutes les évasions. Mais vous pourriez avoir plus de chance avec Python :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X