python - 嵌入式用户定义表达式的安全实现策略

标签 python functional-programming interpreter dsl

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

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

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

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

我考虑过支持在 python 中实现函数...我知道我可以 impose restrictions using the eval() function ,我找到了 AST module - 建议一种涉及解析为 AST,然后解释(或在评估之前验证)AST 树的方法。我也读过 pyparse并考虑实现一种定制的、解释性的语言。

我忍不住认为,试图从 eval() 中阻止不良行为是在“向后”解决问题(试图事后阻止不良功能),而实现定制语言将涉及重新发明轮子.

Python 是否已经有了安全、高效、可嵌入的表达式解释器?

最佳答案

PyPy has a sandbox.

如果您在 Web 浏览器中运行它(不可信代码问题的通常位置),请考虑使用类似 Brython 的客户端运行它.没有人关心用户是否破解了他自己的机器。

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

关于python - 嵌入式用户定义表达式的安全实现策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40692619/

相关文章:

functional-programming - 将 curry 映射到参数列表

compiler-construction - 无类型 Lambda 演算的函数式语言

python - 多标签分类的 Tensorflow Argmax 等价物

java - 如何在JAVA中对列表中的每个元素运行函数?

haskell - 如何实现纯函数式标准二进制堆(ocaml 或 haskell)?

c - Brainfuck 解释器问题

android - Android上的Haskell解释器?

python - 如何优化代码以从列表列表中删除所有列表中的 n 个位置

c++ - 为什么语言的简单性和执行时间之间似乎存在紧张关系?

python - 处理后移动文件