Estoy escribiendo un sistema para una aplicación de navegador que almacenará algunos scripts php particulares en una base de datos y luego los sacará y ejecutará cuando sea necesario. Al principio intenté usar exec() y piping para obtener el resultado de un script que sacaba los scripts de la base de datos y los imprimía. Esto funcionó en un caso de uso, pero no en todos, y se siente frágil de todos modos, entonces estoy buscando una mejor manera.Incluir desde la secuencia "php: // memory"
Ahora estoy intentando lograr esto a través del uso de una secuencia de archivos PHP en la memoria. Por ejemplo:
$thing = <<<'TEST'
<?php
$thing = array();
print "Testing code in here.";
var_dump($thing);
?>
TEST;
$filename = "php://memory";
$fp = fopen($filename, "w+b");
fwrite($fp, $thing);
//rewind($fp);
fclose($fp);
include "php://memory";
Sin embargo, no se imprime nada cuando se ejecuta la secuencia de comandos. ¿Esto es incluso posible por este medio, y si no, hay otra manera de hacer esto? Estoy tratando de evitar tener que escribir archivos temporales y leer de ellos, ya que estoy seguro de que acceder al sistema de archivos ralentizaría las cosas. ¿Hay alguna URL que pueda proporcionar para "incluir" para que lea la secuencia de la memoria como si fuera un archivo?
No creo que eval()
haga esto, ya que, si mal no recuerdo, se limita a una sola línea.
Además, no hay respuestas "eval = include = hell". Los usuarios que no son administradores no tienen acceso para escribir los scripts almacenados en la base de datos, sé que esto requiere un tratamiento especial durante el ciclo de vida de mi aplicación.
Mi palabra, estaba totalmente equivocado. Eval funciona para más de una línea. Ni siquiera lo intenté jajaja ... supongo que eso funcionará entonces. Sin embargo, todavía tengo curiosidad acerca de las secuencias de archivos almacenadas en la memoria, por lo que si alguien tiene una respuesta a esa parte, estaría agradecido. –
¿Hay algún motivo en particular por el que no desee crear archivos? El sistema de archivos es una base de datos para archivos. Y: Dios mío, no lo hagas, eso es peligroso. No importa si solo los administradores pueden escribir en estos archivos php, tan pronto como tenga un error de inyección SQL o alguien logre obtener/adivinar/revelar sus credenciales de MySQL -> insta-remote-code-execution. – mensi