php://memory для include()

Arty

Новичок
Приветствую!
Есть такая безумная призадумка как не показать явно код php.
А именно есть главный "отрытый" php который просто подтягивает с пом. include ту часть кода которую желательно не показывать явно. Что бы не показывать - код в файле зашифрованном лежит, потом расшифровывается, складывается в случайный временный файл а линк на файл передается в include, после инклюда файл сразу же можно убрать. Допустим всё ок, но хочется в этой схеме отказаться от создания расшифрованного файла для подстановки в include в файловой системе (пусть и на секунду) а создавать его типа в памяти или потоками или как там ещё... Например вычиталось про php://memory вроде бы то что надо но похоже главная загвоздка в том что include ждет указания на конкретный файл а не указателя на поток..

PHP:
$dat=decode(file_get_contents('d5.dat'));

$fp = fopen('/tmp/ttt', 'w+');

fputs($fp, $dat);

include ('/tmp/ttt');
так работает.. а вот подставить "php://memory" вместо "/tmp/ttt" не выходит .. или я его не так готовлю, подскажите ка для инклюда обойтись без реально существующего файла в ФС...
Спасибо!
 

tz-lom

Продвинутый новичок
eval конечно же
другое дело что данная защита бесполезна - достаточно вместо eval поставить echo и уря,вот он код моей мечты
и в противовес - невозможность кэшировать байт код, что плохо скажется на производительности
 

Arty

Новичок
Так я так понял с eval ещё следить за правильностью написания ?..
Тут не вопрос как скрыть или как оно быстро ломается. А вопрос буквально как заставить инклюд включать не файл из ФС а поток или "файл из memory" вобщем что бы расшифрованный файл не был в пределах досягаемости обычной ФС.
 

Arty

Новичок
Сначала в файле (d5.dat из примера) но в зашифрованном виде.
Потом расшифровав (пусть в php, пусть во внешнем дешифраторе скомпилированном - сейчас не важно) использовать враппер или именованный ресурс
wrappers
а именно "... php://memory и php://temp являются потоками для чтения/записи и позволяют сохранять временные данные в файлоподобной обертке... "

Ещё раз - нужно заставить include отработать с "файлом не в ФС"

Да, его можно тупо создать, отинклюдить и тут же удалить, но хочется и без создания а вот так в памяти или потоке или ещё в чём. Должен же быть простой вариант, просто както ускальзывает :)
 

Вурдалак

Продвинутый новичок
Arty, fpassthru вместо include выведет весь код. Ты борешься с тенью.

А если тебе просто так интересно почему не работает, то приведи код, в котором ты записываешь, считываешь и получаешь ошибку. Ну, и текст ошибки, естественно.
 

Arty

Новичок
подставить "php://memory" вместо "/tmp/ttt" не выходит
буквально именно так с кодом в первом посте.
По другому не знаю как обращаться с php://memory о чём и прошу помочь.
 

Arty

Новичок
Ок. Упростим задачу. Конкретный пример
есть inctest.dat тот самый который надо проинклюдить.
PHP:
<?php
function test(){
printf("kuku"."\r\n");
}
?>
И который на самом деле зашифрован... а не вот так вот в явном виде лежит.

есть maintest.php
по-простому он выглядит так:
PHP:
<?php
include('inctest.dat');
test();
?>
По сложному выглядит вот так:
PHP:
<?php
$data=file_get_contents('inctest.dat');
$fp=fopen('tmpfile','w+');
fputs($fp,$data);
fclose($fp);
include('tmpfile');
unlink('tmpfile');
test();
?>
На самом деле при шифрованном варианте первая строка выглядит типа $data=decode(file_get_contents('inctest.dat'),$pass); (либо передается во внешний декодер за пределами php) и не зная $pass сложновато понять что внутри inctest.dat на самом деле, ну и maintest.php собственно тоже не сработает.

А задача стоит в моём сложном примере сделать так что бы tmpfile не создавался в реальной фс. Он то живёт да - доли секунды - сразу после инклюда удаляется, но всё же.

Зачем.. - не показывать код, тот кто соображает - полюбому докопается, тот кто не очень - чуть подольше повозится, а кто плюнет и пробовать не будет разбираться как устроена функция test() зашифрованная внутри include.dat :)
 

Yuriy_S

-=PHP-Club=-
какая-то бредовая идея, на мой взгляд..
что мешает отобразить значение переменной $data в браузере? тупо через echo например.
 

Arty

Новичок
Я начинал тему не ради того что бы оценили идею, впрочем во втором предложении первого поста вполне трезво оценил ситуацию.

Прошу просто поделиться вариантами передачи данных для include() не указанием на физически присутствующий в ФС файл а с пом php://memory или потоком или ещё как..
Связка file_get_contents и include через временный файл работает. Через eval, fpassthru, $fp как то не выходит.
 

Arty

Новичок
Ну вот, я ж говорил что просто :о) '?>' упустил... Мерси.
Он точно отработает равноценно include?
А и всё же интересны примеры с использованием php://memory так, на будущее.
 

С.

Продвинутый новичок
По идее следующее должно работать, но проверить не могу (нет 5.3)
PHP:
<?
$f= fopen("php://memory", 'r+');
fputs($f, '<? echo "hello" ?>');
rewind($f);
include('php://fd/'.substr($f,14)));
?>
 

Arty

Новичок
По идее следующее должно работать
Код:
$ php test.php
PHP Parse error:  syntax error, unexpected ')' in ..../test.php on line 5
.....edit........
$ php test.php
PHP Warning:  substr() expects parameter 1 to be string, resource given in .../test.php on line 5
PHP Warning:  include(): Invalid php:// URL specified in .../test.php on line 5
PHP Warning:  include(php://fd/): failed to open stream: operation failed in .../test.php on line 5
PHP Warning:  include(): Failed opening 'php://fd/' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in .../test.php on line 5

$ php -v
PHP 5.3.5
 

С.

Продвинутый новичок
Ну попробуй, как-то по-другому найти номер дескриптора.
 

shureen

Милорд Лось Кристофер
Ну писец! Написано же что синтаксическая ошибка. Скобку лишнюю убери
 

Arty

Новичок
Скобку лишнюю убери
Если внимательно посмотрите лог то увидите что она убрана перед второй попыткой.
какая-то бредовая идея, на мой взгляд..
что мешает отобразить значение переменной $data в браузере? тупо через echo например.
Имеется ввиду правка кода со стороны исследователя внутри maintest.php ? Или какието манипуляции в запросе из броузера? Прошу пардон - познания в php соответствуют статусу на данном форуме, про второй вариант не в курсе.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Arty чем тебя не устраивает решение через поток?
 
Сверху