2010-08-15 17 views
5

que tiene una cadena que almacena algunas variables que deben ser ejecutadas para producir un resultado, por ejemplo:¿Qué puedo usar en lugar de eval()?

define('RUN_THIS', '\$something.",".$somethingElse'); 

Cuál es entonces eval() -uated:

$foo = eval("return ".RUN_THIS.";"); 

entiendo que no es seguro si eval la cadena que se evalúa proviene de la entrada del usuario. Sin embargo, si, por ejemplo, quisiera que todo se ejecute en HipHop de Facebook, que no es compatible con eval(), no podría hacerlo.

Aparentemente puedo usar call_user_func() - ¿este es efectivamente el mismo resultado que eval()? ¿Cómo se considera seguro cuando eval() no lo es, si ese es realmente el caso?

Edit: En respuesta a los comentarios, originalmente no dejé en claro cuál es el objetivo. La constante se define de antemano para que el código posterior, ya sea dentro de una clase que tenga acceso a las constantes de configuración o código de procedimiento, pueda usarlo para evaluar la cadena de variables dada. Las variables que deben evaluarse pueden variar (nombres completamente diferentes, orden, formato) dependiendo de la situación, pero se ejecuta con el mismo propósito de la misma manera, por lo que actualmente tengo la cadena de variables establecida en una constante en este camino. Técnicamente, eval() no es inseguro, siempre y cuando el config.php que define las constantes esté controlado, pero ese no era el punto de la pregunta.

+9

Sería útil si pudiera describir por qué está almacenando las variables de esa manera en primer lugar? – Cfreak

+2

Sí, esto suena un poco como un defecto de diseño. ¿No puedes definir un "RUN_THIS" más abstracto (uno que no contenga el código real) que se analiza en un punto posterior del código? –

+1

¿Hay alguna razón que no pueda hacer? '$ Foo =" \ $ something, $ somethingElse ";' –

Respuesta

2

Kendall parece tener a simple solution, pero voy a tratar de responder a su otra pregunta:

Aparentemente puedo usar call_user_func() - es esto de manera efectiva el mismo resultado que eval()? ¿Cómo se considera seguro cuando eval() no lo es, si ese es realmente el caso?

call_user_func es realmente más seguro que eval debido al hecho de que call_user_func sólo puede llamar a una función de usuario. eval por otro lado ejecuta la cadena como código PHP en sí. Puede agregar '; (cierre la cadena y comience una nueva "línea" de código) al final de la cadena y luego agregue un código más, agregue un ;' (finalice la línea de código y comience otra cadena para que no haya sintaxis error), permitiendo así la constante RUN_THIS para contener una gran cantidad de código PHP que el usuario puede ejecutar en el servidor (incluyendo la eliminación de todos los archivos importantes y recuperar información de bases de datos, etc. NUNCA permitir que esto suceda.

call_user_func doesn Deje que suceda. Cuando ejecuta call_user_func_array($func, $args), el usuario solo puede ejecutar un conjunto restringido de funciones porque: (a) la función debe ser definida por el usuario (b) puede manipular $func para asegurarse de que el usuario no pueda ejecutar ninguna función que él o ella quiere con cheque que $func está en una lista de "funciones permitidas" o prefijando algo como user_ con los nombres de las funciones y la variable $func (de esta manera el usuario puede ejecutar solo funciones que comiencen con user_.

+1

'exec'! =' Eval' –

+0

Lo sé. A menos que me haya perdido algo, estoy hablando de 'eval', no' exec'. – Umang

+0

Lee de nuevo tu publicación, "' call_user_func' es en realidad más seguro que ** 'exec' ** porque ...". –

1

No puedo ver ningún motivo por el que no pueda usar la construcción de cadenas de comillas dobles.

$foo = "\$something,$somethingElse"; 
Cuestiones relacionadas