2012-09-09 52 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