Константы не "заполняются" при включении 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) [function.main]: не удалось открыть поток: В разрешении отказано/home/www/this.nl/core/untitled.php в строке 28

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

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

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

Author: Whisperity, 2012-08-06

4 answers

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

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

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

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

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

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

 2
Author: MrWhite, 2012-08-06 14:38:41

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

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

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

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

 7
Author: Whisperity, 2012-08-06 14:09:24
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 (обработанный обычный текст) (потому что вы получите пустой вывод), таким образом, все также смогут видеть ваш код в процессе.

 4
Author: Dejan Marjanovic, 2012-08-06 14:25:08

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

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

Поэтому не используйте внешние включения.

 0
Author: Neal, 2012-08-06 14:04:54