Отложить компиляцию с одного PHP скрипт на другой
Что бы я хотел достичь
Это немного похоже на захват глобальных script фрагментов и компиляцию после их объединения на другом сервере.
Файлы
<?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 | 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 и переименовать его "на лету".
Файлы
Исходный код тот же, но изменен
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;
?>
Исходный код тот же, но без расширения 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 уже...
Но, возможно, более простым решением является использование какой-то репликации или совместного использования файлов между серверами.