我从一个远程处理函数(clojurescriptone)中发现了这段代码,其中正在读取从浏览器发回的数据。我的问题是将 read-eval 设置为 false 的意义是什么?
(绑定 [ read-eval false](读取字符串数据))
谢谢,穆尔塔萨
我从一个远程处理函数(clojurescriptone)中发现了这段代码,其中正在读取从浏览器发回的数据。我的问题是将 read-eval 设置为 false 的意义是什么?
(绑定 [ read-eval false](读取字符串数据))
谢谢,穆尔塔萨
这是一种安全措施,因此浏览器无法发送要在服务器中执行的代码。例如,如果客户端/浏览器发送"#=(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*上的文档。
的主要目的*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。