Включить из потока "php: // memory" - PullRequest
7 голосов
/ 30 марта 2012

Я пишу систему для приложения для браузера, которая будет хранить некоторые конкретные сценарии php в базе данных, а затем извлекать их и выполнять при необходимости.Сначала я попытался использовать exec () и piping для вывода php скрипта, который вытащил скрипты из базы данных и распечатал их.Это работало в одном случае использования, но не во всех, и в любом случае кажется хрупким, поэтому я ищу лучший способ.

Я сейчас пытаюсь добиться этого путем использования потока файлов PHP в памяти.Например:

$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";

Однако при выполнении сценария ничего не печатается.Возможно ли это даже таким образом, и если нет, есть ли другой способ сделать это?Я пытаюсь избежать необходимости писать временные файлы и читать из них, так как уверен, что доступ к файловой системе замедлит процесс.Могу ли я предоставить URL-адрес для «включения», чтобы он считывал поток памяти, как если бы он был файлом?, он ограничен одной строкой.

Также, пожалуйста, не отвечайте "eval = include = hell".Пользователи без прав администратора не имеют доступа для написания скриптов, хранящихся в базе данных, я знаю, что это требует особой обработки в течение жизненного цикла моего приложения.

Ответы [ 3 ]

5 голосов
/ 11 июня 2012

Вам нужно использовать stream_get_contents для чтения из php://memory stream.Вы не можете включить его напрямую.

4 голосов
/ 12 июня 2012

eval() и include фактически одинаковы.Так что eval() работает с несколькими строками - только к вашему сведению.Однако я бы предпочел include здесь, я всегда думаю, что это быстрее.Может быть, я ошибаюсь, не знаю.

Тем не менее, я думаю, что вы должны отладить свой код, я не вижу причины как таковой, почему он не должен работать.Возможно, вам понадобится rewind указатель (вы это прокомментировали), но вы должны проверить из первых рук, , что ваша конфигурация PHP позволяет включать URL .Я знаю, что этот параметр запрещает использование data:// URI, поэтому вы можете включить это.

Также вы всегда можете попробовать, если PHP может открыть память, используя file_get_contents и выгрузку.Это должно дать вам код.Если нет, то вы уже сделали какую-то ошибку (например, без перемотки или чего-то подобного).

Редактировать: Я не зашел так далеко ( demo ):

<?php
/**
 * Include from “php://memory” stream
 * @link https://stackoverflow.com/q/9944867/367456
 */

$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);

var_dump(stream_get_contents($fp));

Это то, что я узнал:

  1. Не стоит закрывать «файл».php://memory является потоком после закрытия, он исчезнет.
  2. Вам необходимо получить доступ к $fp как к потоку, что невозможно для include из коробки AFAIK.
  3. Затем вам нужно будет создать потоковую оболочку, которая отображает ресурс потока на имя файла.
  4. Когда вы это сделаете, вы можете включить поток памяти.
  5. Необходимые вам настройки PHPпроверить в любом случае.Их более одного, обратитесь к руководству по PHP.

Возможно, будет проще использовать URI данных ( demo ):

<?php
/**
 * Include from “php://memory” stream
 * @link https://stackoverflow.com/q/9944867/367456
 */

$thing = <<<TEST
<?php
\$thing = array();
print "Testing code in here.";
var_dump(\$thing);
TEST;

include 'data://text/plain;,'. urlencode($thing);

См. Какхорошо: Включите код из потока PHP

1 голос
/ 09 июля 2015

Если есть способ включить из памяти php: //, то это серьезная уязвимость. Несмотря на то, что он имеет много применений, eval довольно часто используется с методами запутывания кода, чтобы скрыть вредоносный код.

(Каждый инструмент - оружие, если вы держите его правильно.)

С учетом вышесказанного, (к счастью), кажется, нет никакого очевидного способа включить из php: // memory

...