Lisp数据安全/验证

Way*_*ner 7 lisp security validation

在这一点上,这对我来说真的只是一个概念性的问题.

在Lisp中,程序是数据,数据是程序.REPL正是这样做 - 读取然后进行评估.

那么如何以安全的方式从用户那里获得输入呢?显然它是可能的 - 我的意思是viaweb - 现在雅虎!商店非常安全,所以它是如何完成的?

Rai*_*wig 16

REPL代表Read Eval Print Loop.

(loop (print (eval (read))))
Run Code Online (Sandbox Code Playgroud)

上面只是概念性的,真正的REPL代码要复杂得多(有错误处理,调试......).

您可以在不对其进行评估的情况下阅读Lisp中的各种数据.评估是一个单独的步骤 - 独立于阅读数据.

Lisp中有各种IO函数.提供的最复杂的函数通常是READ,它读取s表达式.Common Lisp中有一个选项允许在READ期间进行评估,但在读取数据时可以并且应该关闭它.

因此,Lisp中的数据不一定是程序,即使数据是程序,Lisp也可以将程序作为数据读取 - 无需评估.REPL只应由开发人员使用,不应暴露给任意用户.为了从用户获取数据,可以使用普通的IO函数,包括READ等函数,它可以读取S表达式,但不会对它们进行求值.

以下是一些不应该做的事情:

  • 使用READ读取任意数据.阅读示例允许人们读取非常大的数据 - 没有限制.

  • 在READ期间评估('read eval').这应该关闭.

  • 从I/O读取符号并调用其符号函数

  • 当您的函数需要普通列表时,使用READ读取循环数据结构.沿着循环列表走,可以使您的程序忙碌一段时间.

  • 在从数据读取期间不处理语法错误.


Wil*_*ung 6

你按照其他人的方式去做.您从流中读取一串数据,解析它以获取命令和参数,验证命令和参数,并解释命令和参数.

这里没有魔力.

简单地说,你不做的是,你不要将你的Lisp监听器暴露给未经验证的,不安全的数据源.

如前所述,REPL是读取 - 评估 - 打印.@The Rook专注于eval(有理由),但不要打折READ.READ是Common Lisp中非常强大的命令.在你甚至获得"eval"之前,读者可以自己评估代码.

不要将READ暴露给您不信任的任何东西.

有了足够的工作,你可以制作一个自定义包,限制可用于该包的功能范围等.但是,我认为这不仅仅是简单地编写一个简单的命令解析器,而不是担心我错过的一些副作用.