嵌入式用户定义表达式的安全实施策略

aSt*_*eve 5 python dsl interpreter functional-programming

我现在至少在Python中设计/原型化一个领域特定语言... 设计很简单 - 但需要支持指定任意函数(其域是从标签到整数的映射 - 范围是整数.)在许多情况下,该函数将仅选择域中的标签以产生结果......但我希望允许在通用编程语言中轻松(和有效)实现的任何函数的规范.

需要注意的是,我希望函数"安全"......我的意思是:

  • '纯'功能:确定性,无副作用.(即没有外部状态;没有与文件,I/O,设备等的交互)
  • 终止 - 成功或在特定(小规模)分配的计算资源到期后终止.

我非常希望能够有效地实现这个功能 - 我希望不经常提供定义 - 并且经常进行评估.我还希望使用熟悉的语法定义函数.

我已经考虑过在python中支持函数的实现......我知道我可以使用eval()函数强加限制,并且我找到了AST模块 - 建议一种涉及解析AST的方法,然后解释(或在评估之前验证)AST树.我还读过有关pyparse和consdered实现定制,解释的语言.

我不禁想到,试图阻止来自eval()的不良行为是"向后"解决问题(试图阻止事后阻止不良功能),而实施定制语言则需要重新发明轮子.

Python是否已经拥有一个安全,高效,可嵌入的表达式解释器?

gil*_*lch 0

PyPy 有一个沙箱。

如果您在 Web 浏览器中运行此程序(通常会出现不受信任的代码问题),请考虑使用Brython之类的工具在客户端运行它。没有人关心用户是否入侵了自己的机器。

如果您确实实现了定制解释器,则不必重新实现所有轮子。人们认为在不受信任的代码上使用它相对安全compile(),但要注意大量常量会占用时间和内存。在您可以杀死的单独进程中运行编译器。然后你只需要编写一个无法访问任何重要内容的 Python 字节码解释器。