Foros del Web » Programando para Internet » PHP »

Fatal error al tratar de usar "eval()"

Estas en el tema de Fatal error al tratar de usar "eval()" en el foro de PHP en Foros del Web. Hola. Tengo un problema poco molesto, y se trata sobre el uso de la función eval() . Estoy haciendo una aplicación web que carga códigos ...
  #1 (permalink)  
Antiguo 12/08/2008, 17:04
Avatar de julianmejio  
Fecha de Ingreso: agosto-2005
Ubicación: Medellín, Antioquia
Mensajes: 88
Antigüedad: 18 años, 8 meses
Puntos: 3
Exclamación Fatal error al tratar de usar "eval()"

Hola.
Tengo un problema poco molesto, y se trata sobre el uso de la función eval().
Estoy haciendo una aplicación web que carga códigos que están en un respositorio de internet, accedido mediante un servicio web. El problema es que no puedo usar la función eval() para ejecutar dicho código porque me arroja un fatal error donde me dice que la función que estoy intentando usar es desconocida:
Cita:
Fatal error: Call to undefined function header() in C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\X_TMP_SRV_LOCAL_P\base \php\class.WSRC-Req.php(146) : eval()'d code on line 1
¿Cómo así que la función header() no está definida?. Estoy trabajando (las pruebas) en un servicio local de Apache bajo windows: Apache/2.2.9 (Win32) mod_ssl/2.2.9 OpenSSL/0.9.8h PHP/5.2.6 con libmysql.dll activo y funcionando. Siempre me ha funcionado bien en todos los aspectos menos cuando utilizo eval() (esta no es la primera vez que me pasa ). Otros detalles técnicos son:
  1. El código a evaluar se guarda codificado en base64 en una variable dentro del mismo código. Cuando evalúo el código, obviamente decodifico antes de evaluar.
  2. El código a evaluar no tiene etiquetas php (<?php .. ?>), porque en definitiva no las necesita
  3. Hice pruebas montando exactamente el mismo código en otra variable y ejecutándolo, y me funcionó, pero cuando intento ejecutar el código recuperado desde el servicio web me arroja ese error absurdo.
  4. Lo probé en el servidor de internet, donde va a estar montado en definitiva, y tampoco funcionó, así que no debe afectar en que sea Windows, o un servicio local, o lo que sea, sino primero que todo en la implementación.
  5. Ya he probado escapando las comillas, comillas simples, signos "$", y nada que funciona.

Aquí les dejo el código de la implementación, y pues, el servicio web si es una caja negra, pero igualmente funciona, así que debe ser problema de alguna de estas líneas:

Código PHP:
// Después de varios requires propios del cliente del servicio web, envía una petición a éste y devuelve todo un paquete con códigos.
$paquete $servC->EnviarPeticion();
// El código llega codificado en base64, así que lo decodifico.
$cod base64_decode($paquete);
// Y pues, después de tanto probar, tengo que ver si es problema del código, pero es un código normal y natural de php, como cualquier otro
echo $cod;
// Y evalúo el código, pero me sale el error.
eval($cod);

// El código evaluado es: header('location: index'); 
Debería, por lo menos para mi caso, reenviarme a una otra página dentro del sitio, pero lo único que dice es que header() no está definida, y bueno, intenté copiar el mismo código en una variable dentro del mismo script anterior, y ahí sí me dio, pero el problema es que ese código no siempre va a ser el mismo, y no sé cuándo va a cambiar (todo depende del servicio web), así que no puedo dármelas de que copio ese código y ya lo ejecuto y hago de cuenta que nada pasó. Necesito alguna solución.
Gracias por el tiempo, y si pueden ayudarme, no caería mal

Les envío la URL donde se encuentra la implementación del código, que debería evaluar OK y enviar a una página que no existe (index.php), o sea, que debería arrojar un error 404 si está bien, no debería aparecer ese Fatal Error:

http://74.220.207.157/~grupodsi/~productos/idem/base/php/class.WSRC-Req.php

NOTA:
  1. El array del principio es control, nada tiene que ver con el problema.
  2. La línea después del array es el código ya recuperado que hay que ejecutar, ¡y nunca se ejecuta!.
  3. El Fatal Error demuestra que no se ejecuta.
  4. Se ve más elegante en el código fuente.

Última edición por julianmejio; 12/08/2008 a las 17:16 Razón: Completar información relevante al problema.
  #2 (permalink)  
Antiguo 12/08/2008, 19:41
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Fatal error al tratar de usar "eval()"

Mmmm muy raro el problema, en sí no debería fallar, ¿Porque no reportas el Bug en PHP?

Saludos.
  #3 (permalink)  
Antiguo 12/08/2008, 23:22
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Fatal error al tratar de usar "eval()"

intenta así...

Código PHP:
eval("?>$cod"); 
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 13/08/2008, 14:28
Avatar de julianmejio  
Fecha de Ingreso: agosto-2005
Ubicación: Medellín, Antioquia
Mensajes: 88
Antigüedad: 18 años, 8 meses
Puntos: 3
Respuesta: Fatal error al tratar de usar "eval()"

Cita:
Iniciado por pateketrueke Ver Mensaje
intenta así...

Código PHP:
eval("?>$cod"); 
Ya lo intenté, no me dio: me toma el código como texto normal, y sólo lo muestra. Así que también lo intenté así:

Código PHP:
eval("?><?php $cod ?>");
Y me sale el mismo error.

Pues si, este error también me extraña, no poder ejecutar código cargado desde otro archivo, al principio pensé que era por la codificación, pero ambos archivos son codificados en UTF-8, y hasta decodificados (utf8_decode()) no me da, así que figuró reportarlo a ver si ellos saben por qué pasa, o si es en verdad un bug de php.
  #5 (permalink)  
Antiguo 13/08/2008, 14:48
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Fatal error al tratar de usar "eval()"

Deberías de reportarlo, y como "parche" mientras checa si el código tiene la función header() y la reemplazas por una función propia como por ejemplo my_redirect() para ejecutarla en el eval.

Saludos.
  #6 (permalink)  
Antiguo 13/08/2008, 14:57
Avatar de julianmejio  
Fecha de Ingreso: agosto-2005
Ubicación: Medellín, Antioquia
Mensajes: 88
Antigüedad: 18 años, 8 meses
Puntos: 3
Respuesta: Fatal error al tratar de usar "eval()"

Cita:
Iniciado por GatorV Ver Mensaje
Deberías de reportarlo, y como "parche" mientras checa si el código tiene la función header() y la reemplazas por una función propia como por ejemplo my_redirect() para ejecutarla en el eval.

Saludos.
Pues lo intentaré, igual header() es una función interna de PHP y como tal no debería decir que no está definida; y de pronto si podría funcionar creando una función propia, pero sería prácticamente re-escribir todas las funciones internas de PHP , ya que header() no es la única que se usa en los códigos (es sólo un script sencillo que se carga para ver si funciona), es más, no sabría con certeza cuáles son las que se van a usar.
  #7 (permalink)  
Antiguo 13/08/2008, 15:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Fatal error al tratar de usar "eval()"

Mmm acabo de hacer esta prueba:
Código PHP:
<?php
$code 
'header("Location: test/index.html");';

eval(
$code);
?>
y funciona correctamente, me redirige a test/index.html, estoy usando PHP Version 5.2.6.
  #8 (permalink)  
Antiguo 13/08/2008, 15:21
Avatar de julianmejio  
Fecha de Ingreso: agosto-2005
Ubicación: Medellín, Antioquia
Mensajes: 88
Antigüedad: 18 años, 8 meses
Puntos: 3
Respuesta: Fatal error al tratar de usar "eval()"

De hecho esa prueba también la hice, creé una variable con el mismo código y lo evalué y sí me funcionó. El problema es cuando ese código me lo trae el servicio web:

Código PHP:

$code 
$respuestaPreviaDelServicioWebEnBase64;
eval(
base64_decode($code));

// Ahí es donde radica el error. 
Y no solo pasa ahí, en general es cuando traes el código desde un archivo y lo intentas evaluar, por eso me guío más por problemas de codificación, y por eso es que opté por transferir el código en base64, que virtualmente me da la certeza de que lo que estoy transfiriendo se transfiere de forma segura (sea cual sea el contenido: binario entre otros). Lo que voy a hacer ahora es probar si son estrictamente iguales: el código que me arroja el servicio web contra el mismo código pero escrito por mí en una variable, si me da diferente, por lo menos ya sé que el servicio web me está arrojando algún caracter invisible que no deja ejecutar el código, pero si me da igual, envío el problema a PHP a ver qué solución me dan.
  #9 (permalink)  
Antiguo 13/08/2008, 15:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Fatal error al tratar de usar "eval()"

Mmmm :
Código PHP:
<?php
$code 
'aGVhZGVyKCJMb2NhdGlvbjogdGVzdC9pbmRleC5odG1sIik7';

eval(
base64_decode($code));
?>
Donde $code = 'header( "Location: test/index.html" )'; y funciona correctamente...
  #10 (permalink)  
Antiguo 13/08/2008, 15:34
Avatar de julianmejio  
Fecha de Ingreso: agosto-2005
Ubicación: Medellín, Antioquia
Mensajes: 88
Antigüedad: 18 años, 8 meses
Puntos: 3
Respuesta: Fatal error al tratar de usar "eval()"

Bueno, ya hice lo que dije que iba a hacer, y en efecto, cuando traigo el código desde el servicio web se transfieren unos caracteres invisibles al ojo humano, pero un editor hexadecimal me mostró la cruda realidad: la sentencia que ejecuto yo, escrita directamente en una variable, arroja los siguientes bytes:

68656164657228276C6F636174696F6E3A202E2E2F27293B

que sería la instrucción:

Código PHP:

header
('location: ../'); 

Y la instrucción que me arroja el servicio web, me da los siguientes bytes:

EFBBBFEFBBBF68656164657228276C6F636174696F6E3A202E2E2F27293B

(Los bytes en rojo son los que generan el bendito error.)

que sería la instrucción:

Código PHP:

//header('location: ../'); 
¿Ya vieron? ¡claro que la función header() está definida!, lo que PHP dice es que la función header() no lo está, y por eso el error.

Ahora sólo me queda el trabajo de, si no es más óptimo, editar los archivos para borrar los primeros caracteres de los archivos de código. O borrarlos antes de enviar la respuesta desde el servicio web.

Última edición por julianmejio; 13/08/2008 a las 15:37 Razón: Modificar algunos tags de estilo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:23.