Descargo de responsabilidad; Estoy plenamente consciente de las dificultades y los "males" de eval, incluyendo pero no limitado a: problemas de rendimiento, seguridad, etc. portabilidadEvaluación PHP y errores de captura (tanto como sea posible)
El problema
de leer el manual de PHP en eval .. .
eval() devuelve NULL a menos de retorno es llamada en el código evaluado, en el que caso el valor pasado para volver es devueltos. Si hay un error de análisis en , el código evaluado, eval() devuelve FALSE y la ejecución del siguiente código continúa normalmente. No es posible detectar un error de análisis en eval() usando set_error_handler().
En resumen, no hay captura de error, excepto devolver falso, que es muy útil, pero estoy seguro de que podría hacerlo mucho mejor.
La razón
Una parte de la funcionalidad del sitio que estoy trabajando se basa en la ejecución de las expresiones. Me gustaría no pasar por el camino de sandbox o módulos de ejecución, así que he terminado de usar eval. Antes de gritar "¿y si el cliente se volviera malo?" saber que el cliente es bastante confiable; él no querría romper su propio sitio, y cualquiera que tenga acceso a esta funcionalidad posee prácticamente el servidor, independientemente de eval.
El cliente conoce expresiones como las de Excel, y no es un problema explicar las pequeñas diferencias, sin embargo, tener algún tipo de advertencia es prácticamente una funcionalidad estándar.
Esto es lo que tengo hasta ahora:
define('CR',chr(13));
define('LF',chr(10));
function test($cond=''){
$cond=trim($cond);
if($cond=='')return 'Success (condition was empty).'; $result=false;
$cond='$result = '.str_replace(array(CR,LF),' ',$cond).';';
try {
$success=eval($cond);
if($success===false)return 'Error: could not run expression.';
return 'Success (condition return '.($result?'true':'false').').';
}catch(Exception $e){
return 'Error: exception '.get_class($e).', '.$e->getMessage().'.';
}
}
Notas
- La función devuelve una cadena de mensaje en cualquier caso
- La expresión de código debe ser un pedazo de una sola línea de PHP, sin etiquetas PHP y sin un punto y coma final
- Las nuevas líneas se convierten en espacios
- Se añade una variable para contener el resultado (expresión debe devolver verdadero o falso, y con el fin de no entrar en conflicto con el regreso de eval, se utiliza una variable temp.)
Por lo tanto, lo que podría agregar a una mayor ayudar al usuario? ¿Hay otras funciones de análisis que puedan identificar mejor los posibles errores/problemas?
Chris.
si se pudiera proporcionar más información sobre lo que "expresiones" que va a utilizar, tal vez podamos ayudar Más. Podría pensar en algunas cosas buenas token_get_all para validar la entrada del usuario;) – NikiC
¿Código PHP normal? Planeo permitir el acceso completo a PHP, con la posible excepción de definir funciones y clases, lo cual no es necesario. – Christian