Lisp阅读器中的关键字输入是否危险?

时间:2014-03-29 20:11:32

标签: security common-lisp

在Doug Hoyte的Let Over Lambda的第102页,作者说这是关于他的安全读取字符串函数:

  

这意味着向量,位向量,gensyms,循环引用,#。,以及所有其余的都出来了。安全读取字符串甚至不允许使用关键字或外包符号。

我试图想到对关键字符号的恶意使用让我的大脑紧张。是为了方便而将他们排除在外还是可以用它们做些恶事?

2 个答案:

答案 0 :(得分:6)

您可以创建安全的读者,例如,因为您希望保护您的软件免受不适当的输入。不合适的宇宙是非常大的,例如攻击者可能会向你提供大量随机符号名称,以期耗尽记忆。

如此安全的读者是偏执狂。如果你需要一个安全的阅读器,一个好的做法是从一个没有能力的读者开始,然后开始添加你必须拥有的东西。但那很乏味。因此,另一种方法是丢弃大块的功能,然后仅在需要时将其添加回来。这个例子说明了第二种情况。他失去了关键字,因为他想要取消对包裹的任何访问。关键词只是附带损害。

这个例子很好,因为它简洁易懂。

答案 1 :(得分:2)

您指的是part about reader macros以及清理用户输入的示例。

如果您让用户从未定义的包中输入符号,例如UNDEF::SOMETHING,则会引发错误,如果您没有处理程序,则您的Web应用程序将会停止运行。

safe-read-from-string是禁止字符#\##\:#\|的解决方案的作者示例。通过将#\:列入黑名单,它不会允许包装符号,但作为副作用,它也会禁用关键字。

他在后面的章节中指出:

  

即使你删除:字符,我们上面的包shell代码也会   被挫败,因为我们在阅读过程中发现了所有错误,包括   错误表明不存在的包。

因此,通过使用户定义的读取器捕获错误,您可以再次允许关键字。

使用阅读器时清理数据非常重要,并且要小心如何使用用户数据。当你写一些像web服务器这样的东西时,不能太小心,所以阅读字符串会更安全吗?