2012-09-09 10 views
7

Leyo este código desde una función remota (clojurescriptone) donde se leen los datos enviados desde el navegador. Mi pregunta es: ¿cuál es la importancia de establecer el valor de read-eval en falso?¿Qué hace la variable * read-eval *?

(vinculante [lectura eval falsa] (Read-cadena de datos))

, gracias, Murtaza

Respuesta

9

Es una medida de seguridad para que el navegador no puede enviar el código a ser ejecutado en el servidor. Por ejemplo, si el cliente/navegador envía "#=(eval (System/exit 1))" y * read-eval * es verdadero, el proceso del servidor se cerrará, que probablemente sea algo que no desea.

ver la diferencia de comportamiento:

(binding [*read-eval* false] (read-string "#=(eval (System/exit 1))")) 
(binding [*read-eval* true] (read-string "#=(eval (System/exit 1))")) 

ver también la documentación sobre *read-eval*.

+0

Gracias por explicarlo @dAni! Fue muy útil. – murtaza52

+0

El 'eval' confundirá a las personas. El punto es que la expresión después de # = se evalúa cuando '* read-eval *' es verdadero. No es necesario usar eval. – miner49r

4

El objetivo principal de *read-eval* es permitir que el lector evalúe una expresión en tiempo de lectura, normalmente para algo que no tiene una notación literal. Si *read-eval* es verdadero (el valor predeterminado), read y read-string evaluará la expresión siguiente # =. Puede ver cómo se usa esa característica cuando *print-dup* está ligado a verdadero, lo que significa que quiere que los valores se impriman de manera que se conserven sus tipos precisos, en cuyo caso verá que algunos valores se imprimen con # = notación. El valor predeterminado para *print-dup* es falso; para la mayoría de las cosas, la notación Clojure estándar está bien. Por ejemplo, normalmente no nos importa la distinción entre enteros y largos.

La característica *read-eval* es útil para cargar código, pero crea un riesgo de seguridad cuando se usa con una entrada que no es de confianza. El consejo habitual antes de Clojure 1.5 era vincular *read-eval* falso cuando se trata de la entrada del usuario. Sin embargo, todavía hay algunos problemas con la lectura de objetos Java que pueden causar problemas. Eso está arreglado en Clojure 1.5. Más importante aún, Clojure 1.5 introdujo, clojure.edn/read y clojure.edn/read-string que no admiten ninguna de las características de *read-eval*. Son seguros para leer la entrada del usuario que representa los valores habituales de Clojure definidos por el formato EDN. Consulte http://edn-format.org para obtener más información.