Константы не "заполняются" при включении 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
в свой браузер, я получаю результат страницы, так что это не проблема отсутствия прав доступа, верно?
В чем здесь может быть проблема? Почему константа, которая должна быть глобальной, не "наследуется" при включении с удаленного сервера?
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-файлы можно было читать дословно таким образом.
Обычно вы не можете include
PHP-файлы с удаленных хостов через оболочку HTTP
, потому что, когда ваш анализатор PHP запрашивает включение, он либо не может найти файл (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 (обработанный обычный текст) (потому что вы получите пустой вывод), таким образом, все также смогут видеть ваш код в процессе.
Обычно не рекомендуется использовать внешние включения.
Обычно они плохо работают (или вообще не работают).
Поэтому не используйте внешние включения.