在2024年Clojure调查中分享您的想法!2024 State of Clojure Survey!

欢迎!有关如何工作的更多信息,请参阅关于页面。

+1
语法和读取器

我是Clojure的新手,试图了解一些语言的安全特性。

在文档中,我了解到将read-eval绑定到unkown应该会拒绝执行代码。

但在clojure.core/read-string的代码下我测试,使用clojure.tools.reader/read-string它确会执行。

我还看到reader.edn不会执行代码,但想确保即便我们的开发人员在误操作中使用了clojure.tools.reader,也不会执行代码

提前感谢,Rotem

POC

(binding [*read-eval* :unknown]
(clojure.tools.reader/read-string "#=(* 2 21)"))
=> 42

1 个答案

+1

如果他们“不小心”包含了额外的库并调用任意代码,那么他们可能会犯下任何错误。

clojure.tools.reader有一个相似的动态变量clojure.tools.reader/*read-eval*,它以相同的方式使用,因此您需要绑定两者。

by
明白了,我想要设置一个 *read-eval* 为未知的状态以进行测试,以验证没有代码被执行,就像 clojure.core 不需要 clojure.core/*read-eval* 绑定一样。

是的,在安全方面,我想要确保开发者知道他们想要评估功能。我建议默认设置为 false,但这是一个更核心的需求。

我建议添加适当的文档,因为目前的情况不够清晰,可能会在那里产生我们没有想到的代码执行。
by
这里关于 clojure.core/read 和 clojure.core/read-string 的文本是否澄清了任何事情?它是在几年前写入的,当时 clojure.edn 命名空间被添加到 Clojure 中,并且 read 函数具有不读取代码的变种,对我来说,它仍然看起来是准确的:[https://docs.clojure.org/clojure.core/read](https://docs.clojure.org/clojure.core/read)
by
这里的困惑是否是由于这份文档没有明确指出它所讨论的是哪个 *read-eval* 造成的?

http://clojure.github.io/tools.reader/#clojure.tools.reader/read-string

我可以理解为什么有人读过核心的 read/read-string 文档,然后阅读 tools.reader 的文档,而不会将它们联系起来,认为它讨论的是独立的 clojure.tools.reader/*read-eval* 而不是核心变量。

我可以看到为什么绑定核心变量的人希望它“普遍适用”(即可能也会控制 Contrib 库的行为——基于假设 Contrib 库属于 Clojure 组织,因此可能有一定的依赖性)。
by
Sean,我认为这正是我的想法和困惑所在。

我看到许多Clojure开发者在使用read-string,但实际上并没有真正理解其对安全性的影响。即使在尝试通过*read-eval*符号禁用它时,也很容易混淆,这是我通过这次讨论学到的,需要设置不同命名空间下的两个绑定

我希望有一个可以绑定的绑定,可以确保在那里不会有那些常见的read-string函数进行eval操作
一个好的方法就是教育开发者关于clojure.core/read和clojure.core/read-string的安全性,例如,向他们指出我给出的链接中的示例。

另一个方法是向他们提供几个他们认为安全的函数,并建议他们使用这些函数。你可以自由地用量句或撰写长时间的文档字符串来解释为什么它们更安全,以及替代方案的不安全性。

现成的替换选项是为了让那些使代码更安全的人更方便。仍然需要教育,让他们知道这些函数的存在。
...并且鼓励他们不要使用tools.reader函数——它是一个常见的传递依赖项,所以我可以看到他们如何在代码库中找到它,并认为使用“reader”命名空间读取字符串是显然正确的方式。
...