我从远程处理函数(clojurescriptone)中浏览此代码,从浏览器发回的数据正在被读取。我的问题是将read-eval设置为false的意义是什么?变量* read-eval *做什么?
(结合[读EVAL假](读取字符串数据))
谢谢, 穆尔塔扎
我从远程处理函数(clojurescriptone)中浏览此代码,从浏览器发回的数据正在被读取。我的问题是将read-eval设置为false的意义是什么?变量* read-eval *做什么?
(结合[读EVAL假](读取字符串数据))
谢谢, 穆尔塔扎
这是一个安全措施,以便在浏览器不能发送代码,以在服务器中执行。例如,如果客户端/浏览器发送"#=(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*的文档。
的*read-eval*
的主要目的是为了让读者在读时间的东西,没有一个文字符号对表达式求值,通常。如果*read-eval*
为真(默认),则read
和read-string
将评估#=后面的表达式。当*print-dup*
被绑定为true时,您可以看到该功能是如何使用的 - 这意味着您希望以保留其精确类型的方式打印值,在这种情况下,您会看到一些使用#=符号打印的值。 *print-dup*
的默认值是错误的 - 对于标准Clojure符号的大部分情况都是好的。例如,我们通常不关心整数和长整数之间的区别。
的*read-eval*
功能是加载代码是有用的,但不可信的输入使用时,它会创建一个安全风险。在Clojure 1.5之前的通常建议是在处理用户输入时绑定*read-eval*
错误。但是,阅读可能导致问题的Java对象仍然存在一些问题。这在Clojure 1.5中得到了修复。更重要的是,Clojure 1.5推出了clojure.edn/read
和clojure.edn/read-string
,它们不支持任何*read-eval*
功能。它们可以安全地读取用户输入,代表EDN格式定义的常见Clojure值。有关更多信息,请参阅http://edn-format.org。
感谢您解释@dAni!这非常有帮助。 – murtaza52
'eval'会混淆人。重点是#=后面的表达式在'* read-eval *'为真时评估。不需要使用eval。 – miner49r