Константы не "заполняются" при включении файла PHP с удаленного сервера


У меня есть следующая проблема: я получил PHP-файл (standards.php) с такими инструкциями:

define('CONSTVAR', '/path/');

Теперь у меня есть другой файл под названием untitled.php, содержащий следующее:

include ('standards.php');
echo CONSTVAR;
Это приведет к тому, что на странице будет написано /path/, значение константы.

Пока все хорошо.

Но когда я помещаю standards.php на другой из моих веб-сайтов и пытаюсь включить его оттуда (используя команду include('http://mysite.eu/core/standards.php');), это не работает. Константа остается пустой, и я также получаю следующее ошибка

Предупреждение: главная(http://mysite.eu/core/standards.php) [функция.main]: не удалось открыть поток: разрешение отказано в /home/www/this.nl/core/untitled.php в строке 28

Предупреждение: main () [функция.include]: неудачное открытие 'http://mysite.eu/core/standards.php' для включения (include_path='.: / usr / local/php4 / lib / php') в /home/www/this.nl/core/untitled.php в строке 28

allow_url_include включен и allow_url_fopen тоже. Когда я ввожу полный URL-адрес standards.php в свой браузер, я получаю результат страницы, так что это не проблема отсутствия прав доступа, верно?

В чем тут может быть проблема? Почему константа, которая должна быть глобальной, не "наследуется" при включении с удаленного сервера?

4 2

4 ответа:

Allow_url_include включен и allow_url_fopen тоже. Когда я набираю полный url стандартов.php в мой браузер, я получаю результат страницы, так что это не вопрос отсутствия прав доступа, верно?

allow_url_fopen и allow_url_include можно установить только в php.ini или httpd.конф. Именно локальный сервер препятствует включению файла, что отличается от ввода URL-адреса в браузер.

Почему константа, которая должна быть глобальной, не является "унаследованный" при включении с удаленного сервера?

Даже если внешнее включение сработало, оно не будет работать так, как ожидалось. Includes over HTTP отличаются от стандартных includes.

Вы включаете вывод включенного файла. Внешний PHP-файл обрабатывается на внешнем сервере перед включением.

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

Обычно вы не можете include PHP-файлы с удаленных хостов через оболочку HTTP, потому что, когда ваш PHP-парсер запрашивает include, он либо не находит файл (include используется для включения файлов из локальной файловой системы с абсолютными или относительными путями), либо удаленный веб-сервер отправляет ему не исходный код , а обработанный PHP-файл, который он отправил бы браузеру. И include принимает исходный код.

Для получения дополнительной информации, взятой из ручного ввода include():

Предупреждение. ПРЕДУПРЕЖДЕНИЕ БЕЗОПАСНОСТИ:

Удаленный файл может быть обработан на удаленном сервере (в зависимости от расширения файла и того, работает ли удаленный сервер на PHP или нет), но он все равно должен создать допустимый скрипт PHP, потому что он будет обработан на локальном сервере. Если файл с удаленного сервера должен быть обработан там и выведен только, readfile() гораздо лучше использовать функцию. В противном случае, особое внимание должно быть уделено обеспечению безопасности удаленный скрипт для получения допустимого и желаемого кода.

function cthulhu_include($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $code = curl_exec($ch);

    eval($code);

    curl_close($ch);
}

Доставка. Также убедитесь, что у вас есть, например .txt (обычный текст) файл вместо .php (обработанный простой текст) (потому что вы получите пустой вывод), Таким образом, каждый может увидеть ваш код в процессе, тоже.

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

Они обычно плохо работают (или вообще не работают).

Поэтому не используйте внешние includes.