2008-09-03 13 views
28

Estoy tratando de escribir una página que llama a PHP que está almacenado en una base de datos MySQL. La página que está almacenada en la base de datos MySQL contiene código PHP (y HTML) que quiero ejecutar en la carga de la página.¿Cómo ejecuto PHP que está almacenado en una base de datos MySQL?

¿Cómo podría hacer esto?

+8

Gracias por esta pregunta. Al contrario de muchas de las "respuestas" a continuación, esta es una buena y útil. Hay muchos usos LEGIT en los que desearía almacenar comandos PHP en un DB. Decir "no lo hagas" sin conocer las circunstancias es simplemente arrogante. –

Respuesta

30

Puede usar el comando eval para esto. Sin embargo, recomendaría no hacerlo, porque hay muchas trampas que usan este enfoque. La depuración es difícil (er), implica algunos riesgos de seguridad (se ejecuta mal contenido en la base de datos, uh oh).

Véase When is eval evil in php? por ejemplo. Google for Eval es Evil, y encontrarás muchos ejemplos de por qué deberías encontrar otra solución.

Adición: Otro buen artículo con algunas referencias a exploits es this blogpost. Se refiere a los exploits vBulletin y phpMyAdmin anteriores que fueron causados ​​por un uso inapropiado de Eval.

+0

extracto de "Eval is evil": "Permitir que cualquier información suministrada por el usuario entre en una llamada eval() pide ser pirateada". - Bien, ¿y si utilizo mi propio código almacenado en DB y lo usé, p. para la generación de formas personalizadas dinámicas y rápidas? – Jeffz

+0

@Jeffz es mejor que estés muy seguro de que no hay un código malo allí. Además, ¿por qué lo incluirías en una base de datos y no solo en unos pocos archivos de código? –

+0

en ambos sentidos son buenos, si sabes lo que estás haciendo; [UN]. basado en archivos es más seguro (especialmente para los relativamente nuevos en la codificación), [B]. db way es más versátil, si algunos cambios en el código son necesarios ya que la actualización de db es más fácil que actualizar, ajustar (lo que sea) el contenido de un archivo – Jeffz

2

Puede ver la función eval en PHP. Le permite ejecutar código PHP arbitrario. Sin embargo, puede ser un gran riesgo para la seguridad y es mejor evitarlo.

5

eval() función se cubrió en otras respuestas aquí. Estoy de acuerdo en que debe limitar el uso de eval a menos que sea absolutamente necesario. En lugar de tener código PHP en db, podría tener solo un nombre de clase que tenga un método llamado, por ejemplo, execute(). Siempre que necesite ejecutar su código PHP personalizado, simplemente instale la clase de nombre que acaba de obtener de db y ejecute ->execute() en él. Es una solución mucho más limpia y le ofrece un gran campo de flexibilidad y mejora significativamente la seguridad del sitio.

1

¿Ha considerado usar su sistema de control de fuente para almacenar diferentes horquillas para las diversas instalaciones (y los módulos que difieren entre ellas)? Esa sería una de las mejores prácticas para la configuración de la aplicación que se me ocurre. El tuyo no es un requisito inusual, por lo que es un problema que otros han resuelto en el pasado; y el almacenamiento de código en una base de datos es uno que creo que le resultaría difícil encontrar referencia o recibir el asesoramiento como una buena práctica.

Lo bueno es que ha publicado la aclaración. Probablemente, sin querer, has presentado una respuesta en busca de una pregunta adecuada.

22

Fácil:

$x // your variable with the data from the DB 
<?php echo eval("?>".$x."<?") ?> 

Avísame, funciona muy bien para mí en muchas aplicaciones, no puede dejar de notar que todo el mundo se apresura a decir lo malo que es, pero lento para ayudar realmente a cabo con una respuesta directa ...

+1

He corregido su reducción - si no sangra cuatro espacios, '' se trata como una etiqueta HTML y se oculta – dbr

+1

+1 Esta solución funciona prácticamente. Solo aplicar eval ($ x) NO es resolver el problema ya que está rompiendo el código en el signo "<". Entonces esta respuesta resuelve el problema. ¡Saludos a Gapp! – Devner

0

Cómo lo hice es tener un campo en la base de datos que identificó algo único sobre el bloque de código que debe ejecutarse. Esa palabra está en el nombre de archivo de ese código. Puse las cuerdas juntas para señalar el archivo php que se incluirá. ejemplo:

$lookFor = $row['page']; 

include("resources/" . $lookFor . "Codebase.php"); 

De esta manera, incluso si un hacker podría acceder a que DB no podía poner el código malicioso directamente allí para ser ejecutado. Tal vez podría cambiar la palabra de referencia, pero a menos que realmente pueda poner un archivo directamente en el servidor no le haría ningún bien. Si pudiera poner los archivos directamente en el servidor, de todos modos quedarías hundido si realmente quiere ser desagradable. Sólo mis dos centavos valen la pena.

Y sí, hay razones por las que desea ejecutar código almacenado, pero hay contras.

+1

Su afirmación de que este método de inclusión es seguro incluso si un hacker pudiera acceder a su base de datos es incorrecto. Todavía es vulnerable a varios exploits, incluido uno conocido como "envenenamiento de byte nulo" o "inyección de byte nulo" que puede eliminar (ignorar) efectivamente el final de su cadena. Ver [aquí] (https://websec.wordpress.com/2010/02/22/exploiting-php-file-inclusion-overview/) y [aquí] (http://webcache.googleusercontent.com/search?q = caché: www.madirish.net/401) para más detalles. –

0

Lea el código php de la base de datos y guárdelo en un archivo con un nombre único y luego incluya el archivo de esta manera fácil de ejecutar el código php y depurarlo.

$uniqid="tmp/".date("d-m-Y h-i-s").'_'.$Title."_".uniqid().".php";  
$file = fopen($uniqid,"w"); 
fwrite($file,"<?php \r\n ".$R['Body']); 
fclose($file);       
// eval($R['Body']); 
include $uniqid; 
Cuestiones relacionadas