2012-09-09 50 views
7

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

(结合[读EVAL假](读取字符串数据))

谢谢, 穆尔塔扎

回答

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))")) 

也可参阅*read-eval*的文档。

+0

感谢您解释@dAni!这非常有帮助。 – murtaza52

+0

'eval'会混淆人。重点是#=后面的表达式在'* read-eval *'为真时评估。不需要使用eval。 – miner49r

4

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

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