Je fais une application wxpython que je compilerai avec les différents utilitaires de congélation pour créer une exécutable pour plusieurs plates-formes.
Le programme sera une carte éditer pour un moteur de jeu basé sur des carreaux P>
Dans cette application, je souhaite fournir un système de script afin que les utilisateurs avancés puissent modifier le comportement du programme, tel que modifier les données du projet, exporter le projet vers un format différent. P>
Je veux que le système fonctionne comme ça. P>
L'utilisateur placera le script Python qu'ils souhaitent entrer dans une zone de texte styled, puis appuyez sur une touche pour exécuter le script. p>
Je suis bon avec cela jusqu'à présent c'est tout très simple. Obtenez le script de la zone de texte sous forme de chaîne de la compilation à un objet de morue avec la fonction de fonction intégrée (), puis exécutez le script avec une déclaration EXEC P>
script = textbox.text #bla bla store the string code = compile(script, "script", "exec") #make the code object eval(code, globals())
4 Réponses :
réponse facile: non.
Vous pouvez interdire certains mots-clés ( Cela dit, j'ai fait ce type de chose pour les applications Web qui exécutent l'entrée de l'utilisateur et oui, appelez EVAL comme ceci: p> importer code>) et ses opérations, et accède à certaines structures de données, mais vous donnez finalement à vos utilisateurs de puissance un peu du pouvoir. Comme il s'agit d'un client riche qui fonctionne sur la machine de l'utilisateur, un utilisateur malveillant peut planter ou même détruire toute l'application s'ils se sentent vraiment comme ça. Mais c'est leur cas de crash. Documentez-le bien et dites aux gens ce que de ne pas toucher. P>
eval(code, {"__builtins__":None}, {safe_functions})
"Réponse facile: non." -HA! C'est vrai, mais c'est mon intention de créer cette application à 1) apprendre beaucoup sur Python 2) Créer une application pouvant vraiment être utilisée efficacement et puissamment. Je suis conscient que cela empêche complètement l'utilisateur de casser quelque chose est impossible à manquer de ne pas leur permettre de lancer un code. Mais il est certainement possible d'arrêter l'application de s'écraser s'il y a une erreur qui n'attendait pas dans des circonstances qu'ils ne prévoyaient pas. Ou arrêtez l'exécution de leur code si elle est suspendue parce que quelque chose est devenu puni.
Je voulais dire ne pas le restreindre. L'ajout de la fonctionnalité de script est idéal pour les utilisateurs de puissance, mais la mise en garde qu'ils peuvent briser des trucs à peu près universellement.
Vous pouvez intégrer quelque chose comme PYV8 à la place ( code.google.com/p/pyv8 ), Vous auriez donc toujours un langage de programmation complète, mais vous devez fournir vos propres globaux et ajouter une dépendance supplémentaire.
Réponse courte: Non P>
Autres postes liés: P>
Il n'est pas facile de créer un filet de sécurité. Les détails trop nombreux et intelligents hacks sont autour: p>
sur vos objectifs de conception: p> blockQuote>
Il semble que vous essayez de créer un système extensible en fournissant à l'utilisateur de modifier beaucoup de comportement et de logique. p>
L'option la plus simple consiste à leur demander d'écrire un script que vous pouvez évaluer (EVAL) pendant le programme. p>
Comment toujours, une bonne conception décrit, scope la flexibilité et fournit un mécanisme de script via divers schémas de conception allant de la configuration, du plugin aux capacités de script, etc. Les API de script si bien définis peuvent fournir une extensibilité plus significative. Il est aussi plus sûr. P>
Je ne peux pas tout à fait d'accord ni en désaccord avec la dernière partie. Une application qui me permet de me donner un script lui aidera à être beaucoup plus productive (OH, tous ces x devraient être Y ... Eh bien, je vais écrire une boucle qui la corrige). C'est une solution bon marché pour aider les utilisateurs avancés. Mais bien sûr, la configuration "réelle" et les plugins sont très pratiques et accessibles pour plus d'utilisateurs.
@delnan: Je suis tout à fait d'accord avec vous. Mais pour la plupart des utilisateurs, il est encore plus utile de fournir une extensibilité via des plugins, des API de script, etc. Le travail qu'un utilisateur avancé ferait sera très créatif, mais une ardoise vierge ne fonctionne généralement pas bien avec la plupart des utilisateurs.
Je suggérerais de fournir une API de plug-in et permettant aux utilisateurs de fournir des plug-ins sous la forme de fichiers texte. Vous pouvez ensuite les importer en tant que modules dans leur propre espace de noms, attraper des erreurs de syntaxe dans le processus et appelez les différentes fonctions définies dans le module Plug-in, vérifiant à nouveau les erreurs. Vous pouvez fournir un module API qui définit les fonctions / classes de votre programme que le module plug-in a accès à. Cela vous donne la liberté d'apporter des modifications à l'architecture de votre application sans briser les plug-ins, car vous pouvez simplement adapter le module API pour exposer la fonctionnalité de la même manière. P>
Si vous avez la possibilité de basculer sur Tkinter, vous pouvez utiliser l'interpréteur TCL fourni pour traiter votre script. Pour cette affaire, vous pouvez probablement faire cela avec une application WXPYTHON si vous ne démarrez pas la boucle d'événement TK; Utilisez simplement l'interprète TCL sans créer de fenêtres. P>
Étant donné que l'interprète TCL est une chose distincte, il devrait être presque impossible de planter l'interprète Python si vous faites attention à ce que vous exposez à TCL. De plus, TCL facilite la création de DSLS. P>
python - le seul langage de script avec un moteur de script intégré: -). P>
Eval est pratiquement impossible de faire de l'OMI pleinement sécurisé (mais qui ne pas être mon principal domaine d'expertise, je pourrais parler de mon cul). Pourquoi ne pas aller au mode de développement d'une API avec une structure plug-in pour cela, si la sécurité / l'intégration et la portée des fonctionnalités sont une préoccupation?
Hey, au moins ce n'est pas
exec code>.
À tout le moins, reconnaissez-vous que c'est l'un de ceux-ci vraiment, des cas vraiment rares où un «code» de gotta-attrape-'-tous> sauf: code> a le sens et l'appliquer. Pas besoin de planter l'application entière car un utilisateur relativement nouveau à Python a raté un espace. +1 et favoris, je suis impatient d'intégrer un Python Replé une application aussi.
^^ C'est le genre de chose dont je suis vraiment inquiet. Je suis conscient qu'il y a maintenant un moyen d'arrêter complètement quelqu'un qui essaie de causer des dommages. Je m'inquiète plus de prévenir cette erreur de syntaxe ou que l'erreur IO de crash du programme. et empêcher le formulaire d'utilisateur modifiant involontairement les données critiques. Fondamentalement, de ce que je vois ici, le conseil est le suivant: Utilisez Essayer: Sauf:, gardez les données critiques hors de la portée de l'EVAL, fournissez des "fonctions sûres" pour accéder à et modifier les choses qui peuvent se casser.