Я создаю приложение wxpython, которое я скомпилирую с помощью различных утилит замораживания, чтобы создать исполняемый файл для нескольких платформ.
программа будет редактором карт для тайлового игрового движка
в этом приложении я хочу предоставить систему сценариев, чтобы опытные пользователи могли изменять поведение программы, например изменять данные проекта, экспортировать проект в другой формат и т. д.
Я хочу, чтобы система так работала.
пользователь поместит скрипт Python, который он хочет запустить, в стилизованное текстовое поле, а затем нажмите кнопку, чтобы выполнить скрипт.
Я хорошо разбираюсь в этом, это все действительно простые вещи. получить скрипт из текстового поля в виде строки, скомпилировать его в объект cod с помощью встроенной функции compile (), затем выполнить скрипт со статусом exec
script = textbox.text #bla bla store the string
code = compile(script, "script", "exec") #make the code object
eval(code, globals())
дело в том, что я хочу убедиться, что эта функция не может вызвать никаких ошибок или ошибок,
скажите, есть ли в сценарии оператор импорта. вызовет ли это какие-либо проблемы, учитывая, что код был скомпилирован с чем-то вроде py2exe или py2app?
как мне убедиться, что пользователь не может нарушить критическую часть программы, например, изменить часть графического интерфейса, но при этом разрешить их для изменения данных проекта (данные хранятся в глобальных свойствах в собственном модуле)? Я думаю, что это означало бы изменить глобальный dict, который передается функции eval.
как мне убедиться, что этот eval не может вызвать зависание программы из-за длинного или бесконечного цикла? как мне убедиться, что ошибка, возникшая в коде пользователя, не может привести к сбою всего приложения?
в основном, как мне избежать всех тех проблем, которые могут возникнуть, когда пользователь может запускать свой собственный код?
РЕДАКТИРОВАТЬ: Относительно полученных ответов
Я не чувствую, что ни один из ответов до сих пор действительно отвечал на мои вопросы: да, на них даны ответы частично, но не полностью. Я прекрасно понимаю, что полностью остановить небезопасный код невозможно. люди слишком умны, чтобы один человек (или даже группа) мог придумать все способы обойти систему безопасности и предотвратить их.
на самом деле мне все равно, если они это сделают. Меня больше беспокоит, что кто-то непреднамеренно сломает то, о чем они не знали. если бы кто-то действительно захотел, они могли бы разорвать приложение в клочья с помощью скриптов, но мне было все равно. это будет их экземпляр, и все проблемы, которые они создают, исчезнут, когда они перезапустят приложение, если они не испортили файлы на HD. Я хочу предотвратить проблемы, которые возникают, когда пользователь вводит что-то глупое.
такие вещи, как IOError, SystaxErrors, InfiniteLoopErrors и т. Д.
Теперь ответ на вопрос о сфере охвата. Теперь я понимаю, как определить, к каким функциям и глобальным объектам можно получить доступ из функции eval
, но есть ли способ убедиться, что выполнение их кода может быть остановлено, если оно занимает слишком много времени? Может, система зеленых потоков? (зеленый, потому что это было бы eval, чтобы пользователи беспокоились о безопасности потоков)
также, если пользователь использует оператор import module
для загрузки модуля даже из библиотеки по умолчанию, которая не используется в остальной части класса. могло ли это вызвать проблемы с зависанием приложения с помощью Py2exe, Py2app или Freeze? что, если они вызовут модальную часть стандартной библиотеки? будет ли достаточно, чтобы модальный файл находился в том же каталоге, что и замороженный исполняемый файл?
Я хотел бы получить эти ответы, не задавая новых вопросов, но сделаю это, если потребуется.
exec
. - person nmichaels   schedule 15.10.2010except:
имеет смысл и применяет его. Нет необходимости сбой всего приложения, потому что пользователь, относительно новичок в python, пропустил место. +1 и приветствую, я с нетерпением жду возможности включить Python REPL в свое приложение. - person   schedule 15.10.2010