【问题标题】:Are keywords in Lisp reader input dangerous?Lisp阅读器输入中的关键字是否危险?
【发布时间】:2014-03-29 20:11:32
【问题描述】:

在 Doug Hoyte 的 Let Over Lambda 的第 102 页上,作者谈到了他的 safe-read-from-string 函数:

这意味着向量、位向量、gensyms、循环引用、#. 以及所有其他内容都已淘汰。 Safe-read-from-string 甚至不允许关键字或外来包符号。

我绞尽脑汁想出关键字符号的邪恶用途。他们是为了方便而被排除在外,还是可以用他们做坏事?

【问题讨论】:

    标签: security common-lisp


    【解决方案1】:

    您创建安全的阅读器,例如该示例,因为您希望保护您的软件免受不当输入。不恰当的范围非常大,例如您的攻击者可以向您提供大量随机符号名称,以期耗尽内存。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      他在后面的章节中说:

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

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

      在使用阅读器时清理数据并注意如何使用用户数据非常重要。编写 Web 服务器之类的东西时不能太小心,这样读取字符串可能会更安全?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 2020-09-05
        • 1970-01-01
        相关资源
        最近更新 更多