9

ブラウザから送り返されたデータが読み取られているリモート機能 (clojurescriptone) からこのコードに出くわしました。私の質問は、read-eval を false に設定することの意味は何ですか?

(binding [ read-eval false] (読み取り文字列データ))

ありがとう、ムルタザ

4

2 に答える 2

11

これはセキュリティ対策であるため、ブラウザはサーバーで実行するコードを送信できません。たとえば、クライアント/ブラウザの送信"#=(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*のドキュメントも参照してください。

于 2012-09-09T09:17:15.213 に答える
5

の主な目的は*read-eval*、通常はリテラル表記を持たないものに対して、読者が読み取り時に式を評価できるようにすることです。*read-eval*が true (デフォルト) の場合、# read=read-stringに続く式を評価します。が true にバインドされている場合にその機能がどのように使用されるかを確認できます*print-dup*。つまり、正確な型が保持されるように値を出力する必要があることを意味します。この場合、一部の値が #= 表記で出力されます。のデフォルト*print-dup*は false です。ほとんどの場合、標準の Clojure 表記で問題ありません。たとえば、通常、Integer と Long の違いは気にしません。

この*read-eval*機能はコードの読み込みには便利ですが、信頼できない入力で使用するとセキュリティ リスクが生じます。Clojure 1.5 より前の通常のアドバイスは*read-eval*、ユーザー入力を処理するときに false をバインドすることでした。ただし、問題を引き起こす可能性のある Java オブジェクトの読み取りにはまだいくつかの問題がありました。これは Clojure 1.5 で修正されています。さらに重要なことに、Clojure 1.5 が導入されましたがclojure.edn/readclojure.edn/read-stringこれはどの機能もサポートしていません*read-eval*。EDN 形式で定義されている通常の Clojure 値を表すユーザー入力を安全に読み取ることができます。詳細については、 http://edn-format.orgを参照してください。

于 2013-04-07T15:58:08.907 に答える