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