Convertir string a código Ruby

68 views
Skip to first unread message

Edgar Valderrama

unread,
Nov 14, 2011, 4:26:41 PM11/14/11
to rubysur
Hola gente, estoy trabajando con Rails 3.

Deseo saber si es posible convertir una cadena en código Ruby. Me
explico:

Si tengo esto: variable = "(0..10)"
luego deseo usarlo como un Range para lograr esto: (0..10).include?(5)

Una vez vi algo parecido cuando estuve trabajando con Sinatra. No
recuerdo si es una virtud del Sinatra o es Ruby.

En cualquier caso, deseo estar seguro si es posible.

Gracias.

Agustin Viñao

unread,
Nov 14, 2011, 4:31:44 PM11/14/11
to rub...@googlegroups.com
Algo rapido podes hacer eval(str).
-- 
--
Agustin Viñao

Paradox: Life is a mystery. Don't waste time trying to figure it out. / Humor: Keep a sense of humor, especially about yourself. It is a strength beyond all measure. / Change: Know that nothing stays the same.

Web Developer - Ruby - Ruby On Rails - T.D.D.




2011/11/14 Edgar Valderrama <valder...@gmail.com>

JoeLoui

unread,
Nov 14, 2011, 4:32:05 PM11/14/11
to rub...@googlegroups.com
La virtud es de Ruby, ejecutá:

eval "(0..10).include?(5)"

La función eval, ejecuta el string que le pases como parámetro.

Saludos!
Joe

2011/11/14 Edgar Valderrama <valder...@gmail.com>

Emmanuel Oga

unread,
Nov 14, 2011, 4:32:45 PM11/14/11
to rub...@googlegroups.com
2011/11/14 Edgar Valderrama <valder...@gmail.com>:

> Hola gente, estoy trabajando con Rails 3.
>
> Deseo saber si es posible convertir una cadena en código Ruby. Me
> explico:
>
> Si tengo esto:  variable = "(0..10)"
> luego deseo usarlo como un Range para lograr esto: (0..10).include?(5)

Lo que buscas se llama eval:

http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-eval

Quizas sea tan facil como range = eval("(0..10)")

Y bueno, hace falta mencionar que te asegures de no evaluar cadenas
que no sabes de donde vienen. Onda:

eval("`rm *`")

>
> Una vez vi algo parecido cuando estuve trabajando con Sinatra. No
> recuerdo si es una virtud del Sinatra o es Ruby.
>
> En cualquier caso, deseo estar seguro si es posible.
>
> Gracias.

--
--------------------------------------------------------------
EmmanuelOga.com - Software Developer

Leandro López (inkel)

unread,
Nov 14, 2011, 4:34:35 PM11/14/11
to rub...@googlegroups.com
2011/11/14 Edgar Valderrama <valder...@gmail.com>:

Es posible, y una opción es usando `eval`.

ACHTUNG! Usar `eval` no es buena idea la mayoría de las veces,
especialmente si tiene que ver con contenido recibido desde usuarios.

Si hacés

$ (eval "(0..10)").include? 5

Te devuelve `true`. De ahí a que sea una buena idea hacerlo, ya es
otra discusión. Tenés que tener mucho cuidado con los strings que
recibe tu aplicación si se los vas a pasar a `eval`.

¿Qué es lo que tenés que solucionar de esta manera? Tal vez exista
otra menos peligrosa.

--
Leandro
(inkel)

Alejandro González

unread,
Nov 14, 2011, 4:33:21 PM11/14/11
to rub...@googlegroups.com
2011/11/14 Edgar Valderrama <valder...@gmail.com>
Hola gente, estoy trabajando con Rails 3.

Deseo saber si es posible convertir una cadena en código Ruby. Me
explico:

Si tengo esto:  variable = "(0..10)"
luego deseo usarlo como un Range para lograr esto: (0..10).include?(5)
Se puede hacer con eval, pero a mi personalmente me parece una mala práctica, especialmente si ese "(0..10)" lo vas a recibir desde la web 

Una vez vi algo parecido cuando estuve trabajando con Sinatra. No
recuerdo si es una virtud del Sinatra o es Ruby.

En cualquier caso, deseo estar seguro si es posible.

Gracias.



--
Saludos,
Jano González

Edgar Valderrama V.

unread,
Nov 14, 2011, 4:49:20 PM11/14/11
to rub...@googlegroups.com
Gracias gente por la pronta respuesta.

(0..10).include?(5)  fue sólo un ejemplo básico.

Lo necesito para realizar operaciones matemáticas básicas a partir de una fórmula guardada como un String.

Lo usaré en la parte del Administrador del Sistema.



2011/11/14 Alejandro González <in...@janogonzalez.com>

Juan Pablo Taulamet

unread,
Nov 14, 2011, 5:30:50 PM11/14/11
to rub...@googlegroups.com
Y eval te sirve?

--
Saludos Cordiales,
    Juan Pablo


2011/11/14 Edgar Valderrama V. <valder...@gmail.com>

Nicolás Sanguinetti

unread,
Nov 14, 2011, 5:41:01 PM11/14/11
to rub...@googlegroups.com
2011/11/14 Edgar Valderrama V. <valder...@gmail.com>:

> Gracias gente por la pronta respuesta.
>
> (0..10).include?(5)  fue sólo un ejemplo básico.
>
> Lo necesito para realizar operaciones matemáticas básicas a partir de una
> fórmula guardada como un String.
>
> Lo usaré en la parte del Administrador del Sistema.

Solo por el hecho de que esté detrás de un password no quiere decir
que sea "conveniente" (si tenés un administrador con un password
débil, entonces alguien puede ganar acceso a esta sección y luego
ejecutar código arbitrario en tu servidor).

Si no tenés otra forma de hacerlo (*siempre* hay otra forma de
hacerlo, pero quizás no te parece que amerite el esfuerzo buscar una
solución alternativa), al menos asegurate de que no puedan tirar tu
servidor abajo con esta operación.

Algo como:

def safe_eval(str)
old_safe, $SAFE = 4, $SAFE
eval(str)
ensure
$SAFE = old_safe
end

Google es tu amigo para entender cómo funciona y qué hace $SAFE :)

Saludos,
-foca

Nicolás Sanguinetti

unread,
Nov 14, 2011, 5:45:27 PM11/14/11
to rub...@googlegroups.com
2011/11/14 Nicolás Sanguinetti <h...@nicolassanguinetti.info>:

> 2011/11/14 Edgar Valderrama V. <valder...@gmail.com>:
>> Gracias gente por la pronta respuesta.
>>
>> (0..10).include?(5)  fue sólo un ejemplo básico.
>>
>> Lo necesito para realizar operaciones matemáticas básicas a partir de una
>> fórmula guardada como un String.
>>
>> Lo usaré en la parte del Administrador del Sistema.
>
> Solo por el hecho de que esté detrás de un password no quiere decir
> que sea "conveniente" (si tenés un administrador con un password
> débil, entonces alguien puede ganar acceso a esta sección y luego
> ejecutar código arbitrario en tu servidor).
>
> Si no tenés otra forma de hacerlo (*siempre* hay otra forma de
> hacerlo, pero quizás no te parece que amerite el esfuerzo buscar una
> solución alternativa), al menos asegurate de que no puedan tirar tu
> servidor abajo con esta operación.
>
> Algo como:
>
> def safe_eval(str)
>  old_safe, $SAFE = 4, $SAFE
>  eval(str)
> ensure
>  $SAFE = old_safe
> end
>
> Google es tu amigo para entender cómo funciona y qué hace $SAFE :)
>
> Saludos,
> -foca

Er, en realidad, una vez que seteás $SAFE lo suficientemente alto, no
hay forma de bajarlo de nuevo, por lo que te quedaría en 4 (que es
bastante cerrado).

Sorry por el error.

Mauko Quiroga

unread,
Nov 25, 2011, 7:27:53 PM11/25/11
to rubysur
Si es que conoces de antemano el tipo, lo mejor es hacer uso del
método :send

En tu ejemplo:

Range.send(:new, 0, 10).include? 5

Saludos.

On 14 nov, 19:45, Nicolás Sanguinetti <h...@nicolassanguinetti.info>
wrote:
> 2011/11/14 Nicolás Sanguinetti <h...@nicolassanguinetti.info>:
>
>
>
>
>
>
>
>
>
> > 2011/11/14 Edgar Valderrama V. <valderrama...@gmail.com>:

> >> 2011/11/14 Alejandro González <i...@janogonzalez.com>
>
> >>> 2011/11/14 Edgar Valderrama <valderrama...@gmail.com>

Dario Seminara

unread,
Nov 30, 2011, 7:52:01 AM11/30/11
to rubysur
Si se va a evaluar codigo ruby no confiable, lo mejor seria utilizar
un sandbox para eso, como podria ser https://github.com/tario/shikashi
Reply all
Reply to author
Forward
0 new messages