我可以在受限制的环境中执行不受信任的Common Lisp代码吗?

时间:2014-12-30 06:09:48

标签: common-lisp dsl

假设我想利用Common Lisp读取和执行Common Lisp代码的能力,以便我的程序可以执行用Lisp编写的外部代码,但我不相信那些代码所以我不希望它有访问权限Common Lisp的全部功能。我是否可以限制其环境,以便它只能看到我明确授予其访问权限的包/符号,从而有效地创建DSL?

2 个答案:

答案 0 :(得分:2)

请查看chapter 4 of Let over lambda中的“读者安全性”部分,该部分将深入讨论此主题。特别是,您可能希望将*read-eval*设置为nil。为了解决有关限制访问环境的问题,在Common Lisp中这通常很困难,因为它旨在允许首先访问系统的大多数部分。也许你可以在白色列表符号的方向上使用Let over lambda的想法(与链接章节中的宏字符黑名单相比)。我不认为有任何现成的解决方案。

答案 1 :(得分:2)

要阅读代码,首先禁用*read-eval*(使用#.(do-evil-stuff)之类的东西停止人们在解析期间注入执行。您可能希望使用禁用大多数的自定义读取表进行读取(如果不是全部)读取宏。您可能希望使用自定义的一次性包进行读取,仅导入允许的符号。

一旦您阅读了用户提供的代码,您仍需要验证代码中没有意外的功能/宏引用。如果您使用了自定义程序包,则应该能够确认每个符号都属于这两个类中的任何一个"属于自定义的一次性程序包" (这是用户提供的东西)或"明确允许来自其他地方" (您需要此列表来构建自定义程序包)。

完成后,您可以对其进行评估。

但是,正确地执行此操作需要花费一些精力,并且您确实应该让其他人查看代码并主动尝试打破沙箱。