Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Common lisp 我可以在受限环境中执行不受信任的公共Lisp代码吗?_Common Lisp_Dsl - Fatal编程技术网

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

Common lisp 我可以在受限环境中执行不受信任的公共Lisp代码吗?,common-lisp,dsl,Common Lisp,Dsl,假设我想利用Common Lisp读取和执行Common Lisp代码的能力,这样我的程序就可以执行用Lisp编写的外部代码,但我不信任这些代码,所以我不希望它能够访问Common Lisp的全部功能。我是否可以限制其环境,使其只能看到我明确授予其访问权限的包/符号,从而有效地创建DSL?请查看“阅读器安全”一节,其中对该主题进行了深入讨论。特别是,您可能希望将*read eval*设置为nil。要解决有关限制对环境的访问的问题,在Common Lisp中通常很难做到这一点,因为它的设计初衷是允

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

请查看“阅读器安全”一节,其中对该主题进行了深入讨论。特别是,您可能希望将
*read eval*
设置为
nil
。要解决有关限制对环境的访问的问题,在Common Lisp中通常很难做到这一点,因为它的设计初衷是允许访问系统的大多数部分。也许你可以在白名单符号的方向上使用详细的lambda思想(与链接章节中的宏字符黑名单相比)。我认为没有现成的解决方案。

要阅读代码,首先禁用
*read eval*
(这会阻止人们在解析过程中注入执行,使用类似
#(做坏事)
。您可能希望使用禁用大部分(如果不是全部)的自定义读取表进行读取读取宏。您可能希望使用自定义的、一次性的包进行读取,只导入您允许的符号

一旦阅读了用户提供的代码,您仍然需要验证代码中是否没有意外的函数/宏引用。如果您使用了自定义包,您应该能够确认每个符号属于“属于自定义一次性包”(这是用户提供的内容)或“从其他地方显式允许”(您需要此列表来构造自定义包)

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

但是,正确地执行此操作需要相当多的注意,您确实应该让其他人查看代码并积极尝试突破沙箱