PHP ini file_get_contents внешний URL - PullRequest
       9

PHP ini file_get_contents внешний URL

38 голосов
/ 15 августа 2010

Я использую следующую функцию PHP:

file_get_contents('http://example.com');

Всякий раз, когда я делаю это на определенном сервере, результат будет пустым. Когда я делаю это где-то еще, результатом является то, каким может быть содержимое страницы. Однако, когда я на сервере, где результат пуст, использую функцию локально - без доступа к внешнему URL (file_get_contents('../simple/internal/path.html');), он работает .

Теперь я почти уверен, что это как-то связано с определенной конфигурацией php.ini. Однако я не уверен в том, что один. Пожалуйста, помогите.

Ответы [ 7 ]

39 голосов
/ 15 августа 2010

Требуемая настройка: allow_url_fopen.

У вас есть два способа обойти это без изменения php.ini, один из них - использовать fsockopen(), а другой - использовать cURL .

Я рекомендую в любом случае использовать cURL более file_get_contents(), поскольку он был создан для этого.

31 голосов
/ 15 августа 2010

В дополнение к ответу Эйлина, вы можете использовать функцию, подобную приведенной ниже, чтобы имитировать поведение file_get_contents:

function get_content($URL){
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_URL, $URL);
      $data = curl_exec($ch);
      curl_close($ch);
      return $data;
}

echo get_content('http://example.com');
4 голосов
/ 28 февраля 2013
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.your_external_website.com");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);

лучше всего подходит для http URL, Но как открыть https url, помогите мне

4 голосов
/ 15 августа 2010

Это связано с настройкой конфигурации ini allow_url_fopen.

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

Например, эта ошибка проверки ввода может превратиться в полноценную уязвимость удаленного выполнения кода:

copy($_GET["file"], "."); 
2 голосов
/ 05 июня 2017

Ответы, представленные выше, решают проблему, но не объясняют странное поведение описанного ОП.Это объяснение должно помочь любому проверить связь между сайтами в среде разработки, где все эти сайты находятся на одном хосте (и на одном виртуальном хосте; я работаю с apache 2.4 и php7.0).

Есть тонкостьс file_get_contents() я наткнулся на то, что здесь абсолютно уместно, но без адреса (возможно, потому, что оно либо едва документировано, либо не документировано из того, что я могу сказать, или задокументировано в неясной модели безопасности php, которую я не могу найти).1005 * С allow_url_fopen, установленным на Off во всех соответствующих контекстах (например, /etc/php/7.0/apache2/php.ini, /etc/php/7.0/fpm/php.ini и т. Д.) И allow_url_fopen, установленным на On в контексте командной строки (т.е. /etc/php/7.0/cli/php.ini)вызовы на file_get_contents() для локального ресурса будут разрешены, и никакие предупреждения не будут регистрироваться, например:

file_get_contents('php://input');

или

// Path outside document root that webserver user agent has permission to read. e.g. for an apache2 webserver this user agent might be www-data so a file at /etc/php/7.0/filetoaccess would be successfully read if www-data had permission to read this file
file_get_contents('<file path to file on local machine user agent can access>');

или

// Relative path in same document root
file_get_contents('data/filename.dat')

В заключение следует отметить, что ограничение allow_url_fopen = Off аналогично правилу iptables в цепочке OUTPUT, где ограничение применяется только при попытке «выйти из системы» или «изменить контексты».

NB allow_url_fopen, установленный на On в контексте командной строки (т. Е. /etc/php/7.0/cli/php.ini) - это то, что я имел в своей системе, но я подозреваю, что оно не будет иметь никакого отношения к предоставленному объяснению, даже если оно будет установлено на Offесли, конечно, вы не тестируете, запуская свои скрипты из самой командной строки.Я не проверял поведение с allow_url_fopen, установленным на Off в контексте командной строки.

1 голос
/ 25 июля 2012

Это также даст внешним ссылкам абсолютный путь без использования php.ini

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.your_external_website.com");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
$result = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#",'$1http://www.your_external_website.com/$2$3', $result);
echo $result
?>
0 голосов
/ 31 марта 2012

Добавить:

allow_url_fopen=1

в файл php.iniЕсли вы используете виртуальный хостинг, сначала создайте его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...