Отложить компиляцию с одного PHP скрипт на другой

Что бы я хотел достичь

  • my php- script работает на: http://execute.tld
  • во время работы я хотел бы получить контент (также скрипты) с другого сайта: http://noexecution.tld без выполнения (компиляции), но отложить выполнение
  • Теперь я хотел бы выполнить содержимое http://noexecution.tld на http://execute.tld li >

Это немного похоже на захват глобальных script фрагментов и компиляцию после их объединения на другом сервере.

Файлы

main.php | http://execute.tld/main.php

<?php
$var = 'main.php';
file_put_contents("local_sub.php", file_get_contents("http://noexecution.tld/sub.php") );
include "local_sub.php";
echo $var;
?>

sub.php | http://noexecution.tld/sub.php

sub.php | line 1 notcompiled<br>
<?php $var = 'sub.php | line 2 compiled later<br>'; ?>
sub.php | line 3 notcompiled<br>

Результат после запуска main.php

sub.php | line 1 notcompiled
sub.php | line 3 notcompiled
main.php

Требуемый результат

sub.php | line 1 notcompiled
sub.php | line 3 notcompiled
line 2 compiled later

Мое собственное обходное решение

Мое собственное решение - просто переключить расширение с sub.php на sub.whatever и переименовать его "на лету".

Файлы

main.php | http://execute.tld/main.php

Исходный код тот же, но изменен

file_get_contents (http://noexecution.tld/sub. php") на

file_get_contents ("http://noexecution.tld/sub. DontCompileAsPhp ").

<?php
$var = 'main.php';
file_put_contents("local_sub.php", file_get_contents("http://noexecution.tld/sub.DontCompileAsPhp"));
include "local_sub.php";
echo $var;
?>

sub.DontCompileAsPhp | http://noexecution.tld/sub.DontCompileAsPhp

Исходный код тот же, но без расширения php он также не будет скомпилирован как php.

sub.php | line 1 notcompiled<br>
<?php $var = 'sub.php | line 2 compiled later<br>'; ?>
sub.php | line 3 notcompiled<br>

Результат после запуска main.php(соответствует точно моим потребностям)

sub.php | line 1 notcompiled
sub.php | line 3 notcompiled
line 2 compiled later

Почему меня не устраивает мой обход?

Я хочу иметь чистый способ отложить компиляцию, не играя с расширениями...

Вещи, которые я также пробовал

  • __halt_compiler(); [...]
  • ob_start(); [...]

любая помощь очень приветствуется - thanx заранее | Кстати: это мой первый вопрос

Ответ 1

Как указано в комментариях к @Dagon, вы создадите огромную дыру в вашем приложении, когда просто откроете свои скрипты в мире.

Поскольку вы хотите поделиться сценариями между несколькими приложениями/серверами, я могу по крайней мере 2 способа сделать это:

  • Доступ к главному серверу напрямую, используя безопасное соединение, через SSH, например, и захват скриптов оттуда.
  • Используйте репозиторий Git, чтобы хранить все ваши общие сценарии и автоматически развертывать его на своих серверах.

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

Вы также можете использовать диспетчер зависимостей, например Composer (https://getcomposer.org/), чтобы легко добавлять свои скрипты в новые приложения.

Ответ 2

"Обходной путь", который вы придумали, является единственным решением, хотя есть несколько вариантов. То, что вы делаете, на самом деле не "задерживает выполнение script", вы просто показываете какой-либо текст на (предположительно открытой) веб-странице, которая является исходным кодом PHP.

Сервер, на котором размещен этот текстовый файл, не имеет никакого контроля над тем, что вы делаете при его загрузке, поэтому код, который позже выполняет его, в основном не имеет значения (как имя временного файла, который вы его сохранили, - include doesn ' t проверить расширение файла).

Глядя на это с этой точки зрения, есть несколько способов сделать в основном одно и то же:

  • не заканчивайте имя файла с помощью .php, поэтому сервер не пытается его выполнить.
  • не устанавливайте PHP на этом сервере
  • настройте этот сервер или этот vhost или этот каталог, чтобы не выполнять файлы, заканчивающиеся на .php

Или, конечно же, вы можете написать PHP script, который перекликается с исходным кодом PHP, а не просто помещать код в текстовый файл. Это имело бы смысл, если бы код динамически каким-то образом менялся, что было бы ближе к описанию "задержки выполнения кода".

Ответ 3

Во-первых, и исправьте меня, если я ошибаюсь, php - это интерпретируемый язык, а не скомпилированный.

Что же касается вашего вопроса, я бы очень не рекомендовал поставить ваш код на виду. Это правда, что хакеру нужно будет знать точное имя файла, чтобы иметь доступ к нему, но все же это угроза безопасности, которую я бы не взял. Итак, самое быстрое и простое решение, о котором я могу думать, это:

  • Защитите папку сценариев в noexecution.tld/scripts с помощью файла .htaccess, который должен выглядеть следующим образом:

    AuthType Basic
    AuthName "Do you have security clearance for this ?"
    AuthUserFile /path/to/.htpasswd
    Require valid-user
    

    и .htpasswd, который должен выглядеть так (для аутентификации admin: admin):

    admin:$apr1$kO7YWurq$QHrgAbwXAyNZJfBd/gEc71
    

    Вы можете использовать эту ссылку для создания файла .htpasswd для любого пользователя: пароль, который вам нравится

  • Вы можете либо продолжить изменение расширений php-скриптов,, либо просто добавить это в свой .htaccess, чтобы ваши php файлы в базовых папках обрабатывались как двоичные файлов:

    AddType application/octet-stream .php
    
  • Что касается доступа к файлам в noexecution.tld/scripts теперь из PHP на execution.tld/*.php, вам нужно настроить базовую аутентификацию с помощью curl. Если вы не знаете, как это реализовать, посмотрите этот учебник

Ответ 4

Вы можете использовать warpper script (например, download.php) на сервере noexecution.tld, который предоставляет открытый текст ваших php файлов, как я предложил в Обновить локальный файл php из удаленного php файла

<?php
$file = $_SERVER['DOCUMENT_ROOT'] . $_GET['file'];

// @TODO: Add security check if file is of type php and below document root. Use realpath() to check this.
header("Content-Type: text/plain");
header("Content-Disposition: attachment; filename=\"$file\"");
readfile($file);
?>

Это будет называться как http://noexecition.tld/download.php?file=sub.php

Но. Вы должны добавить меры безопасности к этому script, поскольку он будет поставлять любой файл в вызывающие script даже разумные файлы, такие как файлы конфигурации.

Возможные проверки:

  • Предлагать только файлы .php для загрузки
  • Разрешать загрузку файлов только в определенной папке, например. /Downloadable - script
  • Использовать аутентификацию, по крайней мере, что-то вроде требуемого параметра get, например key = whatEverPassword
  • Использовать временную метку, чтобы разрешить доступ к файлу за определенный период времени.
  • Будьте изобретательны!

Ответ 5

Чтобы экспортировать исходный код:

  • Напишите один script на noexecution, который читает файл, который он получает как аргумент, и выводит исходный код.
  • Защитите его так, чтобы исходный код получал только execute.tld.

Чтобы выполнить его, зачем брать накладные расходы на запись файла (на диск) и его чтение снова, когда eval() Вам придется деактивировать начало (<?php) и конец (?>) тегов с самого конца ввода, но это простая операция строки... которую вы могли бы сделать в noexecution output script уже...

Но, возможно, более простым решением является использование какой-то репликации или совместного использования файлов между серверами.