9

我从一个远程处理函数(clojurescriptone)中发现了这段代码,其中正在读取从浏览器发回的数据。我的问题是将 read-eval 设置为 false 的意义是什么?

(绑定 [ read-eval false](读取字符串数据))

谢谢,穆尔塔萨

4

2 回答 2

11

这是一种安全措施,因此浏览器无法发送要在服务器中执行的代码。例如,如果客户端/浏览器发送"#=(eval (System/exit 1))"并且 *read-eval* 为真,则服务器进程将退出,这可能是您不想要的。

查看行为的差异:

(binding [*read-eval* false] (read-string "#=(eval (System/exit 1))"))
(binding [*read-eval* true] (read-string "#=(eval (System/exit 1))"))

另请参阅*read-eval*上的文档。

于 2012-09-09T09:17:15.213 回答
5

的主要目的*read-eval*是允许读者在阅读时评估表达式,通常是针对没有文字符号的东西。如果*read-eval*为真(默认值),read并将read-string计算 #= 后面的表达式。您可以看到当*print-dup*绑定为 true 时如何使用该功能——这意味着您希望以保留其精确类型的方式打印值,在这种情况下,您将看到一些使用 #= 表示法打印的值。默认为*print-dup*false —— 对于大多数情况,标准的 Clojure 表示法是可以的。例如,我们通常不关心整数和长整数之间的区别。

*read-eval*功能对于加载代码很有用,但在与不受信任的输入一起使用时会产生安全风险。Clojure 1.5 之前的通常建议是*read-eval*在处理用户输入时绑定 false。但是,在读取 Java 对象时仍然存在一些问题,这些问题可能会导致问题。这在 Clojure 1.5 中已修复。更重要的是,Clojure 1.5 引入了,clojure.edn/read其中clojure.edn/read-string不支持任何*read-eval*特性。它们可以安全地读取代表 EDN 格式定义的常用 Clojure 值的用户输入。有关详细信息,请参阅http://edn-format.org

于 2013-04-07T15:58:08.907 回答