Константы не "заполняются" при включении файла 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 ответа:
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 (обработанный простой текст) (потому что вы получите пустой вывод), Таким образом, каждый может увидеть ваш код в процессе, тоже.