私は次のPHP関数を使用します:
file_get_contents('http://example.com');
特定のサーバーでこれを行うと、結果は空になります。他の場所でそれを行うと、ページのコンテンツが何であれ、結果が得られます。ただし、結果が空のサーバーでは、関数をローカルで使用します。外部URL(file_get_contents('../simple/internal/path.html');
)にアクセスせずに、does workです。
今、私はそれが特定のphp.ini設定と関係があると確信しています。しかし、私が確信していないのは、which oneです。助けてください。
探している設定は _allow_url_fopen
_ です。
Php.iniを変更せずに回避するには2つの方法があります。1つは fsockopen()
を使用する方法で、もう1つは cURL を使用する方法です。
file_get_contents()
ではなくcURLを使用することをお勧めします。
Aillynの答えを補完するものとして、次のような関数を使用して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');
$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を開く方法は私を助けます
これは、ini構成設定に関連しています allow_url_fopen
。
このオプションを有効にすると、コードのバグが悪用される可能性があることに注意してください。
たとえば、この入力の検証の失敗は、本格的なリモートコード実行の脆弱性に変わる可能性があります。
copy($_GET["file"], ".");
上記の回答は問題を解決しますが、OPが説明した奇妙な動作を説明しません。この説明は、これらのサイトがすべて同じホスト(および同じ仮想ホスト。私はApache 2.4とphp7.0で作業している)にある開発環境のサイト間の通信をテストする人を助けます。
file_get_contents()
には微妙な点がありますが、ここでは絶対に関連していますが、対処されていません(おそらく、それがほとんど文書化されていないか、私が伝えることができる文書から文書化されていないか、私ができない曖昧なPHPセキュリティモデルの文書に文書化されているためです)見つける)。
関連するすべてのコンテキストで_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
ルールに類似しています。このルールは、「システムを終了」または「コンテキストを変更」する試みが製。
N.B. _allow_url_fopen
_はコマンドラインコンテキストでOn
に設定されます(つまり、_/etc/php/7.0/cli/php.ini
_)はシステム上で持っていたものですが、設定されていても提供した説明には関係ないと思われますもちろん、コマンドライン自体からスクリプトを実行してテストしている場合を除き、Off
に変更します。コマンドラインコンテキストで_allow_url_fopen
_をOff
に設定して動作をテストしませんでした。
また、これにより、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
?>
追加:
allow_url_fopen=1
あなたのphp.ini
ファイル。共有ホスティングを使用している場合は、最初に共有ホスティングを作成します。