变量*read-eval*有什么作用?

mur*_*a52 7 clojure

我从远程处理函数(clojurescriptone)中查看此代码,其中正在读取从浏览器发回的数据.我的问题是将read-eval设置为false的意义是什么?

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

谢谢,穆尔塔扎

Dan*_*ero 9

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

看到行为的差异:

(binding [*read-eval* false] (read-string "#=(eval (System/exit 1))"))
(binding [*read-eval* true] (read-string "#=(eval (System/exit 1))"))
Run Code Online (Sandbox Code Playgroud)

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


min*_*49r 5

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

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