Преодоление ошибки Warning: include() [function.include] в PHP

Thursday, 21 May 09 в 3:14

phpПока пишу объемную статью, небольшое полезное сообщение для разработчиков. Разбирался как-то с ошибкой PHP при попытке установить один скрипт и случайно попал на англоязычный блог, где очень подробно, доходчиво было рассказано о проблеме. Точнее это даже не ошибка, а предупреждение, но скрипт все равно не срабатывал.

Итак, если ваша PHP установка на сервере достаточно защищена и отключено URL file-access, а вы пытаетесь вызвать файл через функцию include с использованием абсолютного пути или обращаетесь к удаленному файл,у то столкнетесь с данной проблемой. Например код:

<?
include ("http://www.somedomain.com/file.php");
?>

Приведет к тому, что вы увидите следующие ошибки PHP при просмотре страницы в браузере:

Warning: include() [function.include]: URL file-access is disabled in the server configuration in /home/user/public_html/page.php on line xx

Warning: include(http://www.somedomain.com/file.php) [function.include]: failed to open stream: no suitable wrapper could be found in /home/user/public_html/page.php on line xx

Warning: include() [function.include]: Failed opening ‘http://www.somedomain.com/file.php’ for inclusion (include_path=’.:/usr/lib/php:/usr/local/lib/php’) in /home/user/public_html/page.php on line xx

В PHP 5 функция include для удаленных файлов отключена по умолчанию, и, если ваш сервер использует другую версию PHP, но имеет безопасную установку, вы также столкнетесь с этой ошибкой.

Причина отключения PHP функции include для файлов достаточно простая – это позволит избежать межсайтовых скриптовых (XSS) атак. Это метод, с помощью которого кто-то из недоброжелателей может внедрить свой собственный вредоносный код в ваш, что, как правило, делается для проведения DoS и DDoS атак, а они в свою очередь приводят к падению сервака. Еще есть включения (заражения) в коде страницы, которые содержат и выводят на экран компьютера сообщения мол “такие-то хакеры сломали ваш сайт” вместо стандартного содержимого страницы.

Поэтому если вы собираетесь попросить хостера разрешить эту функцию для удаленных файлов, хорошенько подумайте еще разок.

С другой стороны эта ошибка может быть преодолена с помощью некоторых лучших решений в вашем коде для вызова удаленных файлов. Если вы хотите включить удаленный файл, я бы рекомендовал использовать вам функцию file_get_contents(). Пропишите ее вместе с некоторой переменой в своем коде:

<?
$a = file_get_contents("http://www.somedomain.com/file.php");
echo ($a);
?>

Если вы хотите включить файл, который уже находится на вашем сайте, используйте относительные пути, а не абсолютные:

<?
include (file.php);
?>

Есть еще одно альтернативное решение, которое еще проще записать с помощью функции require_once без использования всяких сторонних переменных:

<?
require_once($_SERVER['DOCUMENT_ROOT'].'file.php');
?>

Именно это решения я использовал для себя, причем удачно – скрипт заработал. В общем, программируйте правильно:) и ошибок не будет. Возможно, у вас есть что добавить ибо заметка достаточно старая, хотя PHP5 все еще актуально, насколько я понимаю.

P.S. Открылась новая система ссылок, где можно прикупить ссылок для своих англоязычных проектов.
Чистая обувь – лицо компании. Машинки для чистки обуви в Москве, можно и в аренду.
Все салоны красоты Украины – специально для женщин.
Для них также женский журнал – интересно и актуально.

Понравился пост? Подпишись на обновления блога по RSS для блоггеров и вебмастеровRSS, RSS для блоггеров и вебмастеровEmail или twitter для блоггеров и вебмастеровtwitter!
Добавить комментарий

Комментариев - 13 для данного поста

  1. SeoProfy Пишет:

    спасибо за пост, он действительно полезен, достаточно подробно расписал =)

  2. DarkFighter Пишет:

    require_once тормозной

  3. maloypsih Пишет:

    Ох, PHP для меня темный лес.

  4. Chex Пишет:

    хм… глупости какие-то :) я не понимаю вас…
    1. Как можно подключить php файл через инклюд с другого сервера? О_О по протоколу http передаются ведь не исходные коды php файла, а сгенерированный им текст, а инклюд – это подключение php файлов и ФИЗИЧЕСКИ НЕВОЗМОЖНО ПОДКЛЮЧИТЬ УДАЛЕННЫЙ ФАЙЛ ТАКИМ ОБРАЗОМ (это вообще никак невозможно, на самом деле…)
    2. include, require и file_get_contents, file и т.д. выполняют разные действия. Первые подключают и передают интерпритатору на выполнение php код, а вторые считывают в переменную содержание файла и этот файл может быть загружен через http, http://ftp...
    3. Если вы хотите подавить Warning в конкретной строке то перед вызовом функции поставте @, например:

    даже если файла file.php не существует ошибка показана не будет. К стати. Правилом хорошего тона считается писать не <?, а <?php ибо short_php_tag может быть выключен по умолчанию на сервере от чего могут вызвать о вас неприятное впечатление…

    Далее, для тех кто не в курсе. Есть по функционалу разные типы подключаемых функций:
    include, include_once и require, require_once разница в том, что первые будут подключать и передавать файл интерпритатору каждый раз когда он будет вызван. Подробнее описал у себя в блоге http://homebie.com/blog-show/id/197 просто там много писать на эту тему

  5. Tod Пишет:

    Chex, спасибо за подробный комментарий) Я, в принципе, сильно на PHP не программирую и вообще, поэтому кое-где могла закрасться неточность. У меня просто возникла данная ошибка, я нашел решение в инете, попробовал – сработало, поэтому и поделился им с читателями:)

  6. inginer Пишет:

    Спасибо это работает !

  7. настя Пишет:

    очень полезная заметка, мне помогла. спасибо

  8. Zerg Пишет:

    Спасибо, очень помогло… хостер отключил возможность инклюда, и вся поддержка молчит, в день звонков десять сделал, и ругался и делал что они предлагали.. а сайт то валится, посетители уходят (интернет-магазин) с сайта.. теперь буду знать, а рбк уроды, говорят не знаем, что у вас случилось, сделайте трассировку и пинг, я сам в полном удивлении, через командную строку вижу сайт, в браузере не вижу… один всё таки из поддержки сказал, что были недавно дос атаки на сервер и всё уже починили))) отключив абсолютный инклюд.
    Ещё раз спасибо, будем учиться правильно программировать)

  9. Патрик Пишет:

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

    еще раз спасибо!!!

  10. Илья Пишет:

    Огромное СПАСИБО!!!
    Долго не мог натсроить абсолютный путь к файлу в include, ваша статья помогла.

  11. Алексей Пишет:

    Спасибо!!! Наконец-то вопрос решен. Полезная статья.

  12. андрей Пишет:

    недавно заметил такую ошибку, когда в поиск вводишь слово и если его нет на сайте, то выкидывает такую ошибку
    в коде нашел

    и удалил include
    все вроде нормально работает.
    я верно сделал или проблема не в этом?

  13. Tod Пишет:

    андрей, поудалял все посты, где код не добавился.. если все работает, то скорее всего сделал правильно:)

Оставить комментарий (правила комментирования)