2

standards.php次の問題があります。次のようなステートメントを含む PHP ファイル ( ) を取得しました。

define('CONSTVAR', '/path/');

今、私はuntitled.phpこれを含む という別のファイルを持っています:

include ('standards.php');
echo CONSTVAR;

これにより/path/、定数の値を示すページが表示されます。

ここまでは順調です。

しかし、standards.php別の Web サイトに を配置し、そこから (include('http://mysite.eu/core/standards.php');コマンドを使用して) 含めようとすると、機能しません。定数は空のままで、次のエラーも表示されます

警告: main(http://mysite.eu/core/standards.php) [function.main]: ストリームを開くことができませんでした: 28 行目の /home/www/this.nl/core/untitled.php で許可が拒否されました

警告: main() [function.include]: インクルード (include_path='.:/usr/local/php4/lib/php') のために 'http://mysite.eu/core/standards.php' を開くことができませんでした / home/www/this.nl/core/untitled.php 28 行目

allow_url_includeも有効になってallow_url_fopenいます。の完全な URL をstandards.phpブラウザに入力すると、ページの結果が表示されるので、アクセス権がないことは問題ではありませんよね?

ここで何が問題になる可能性がありますか? リモートサーバーからインクルードするときに、グローバルであるはずの定数が「継承」されないのはなぜですか?

4

4 に答える 4

7

通常、PHP パーサーがインクルードを要求すると、ファイルが見つからない (絶対パスまたは相対パスでローカル ファイルシステムからファイルをインクルードするために使用される) か、リモート Web サーバーがそれを送信するためinclude、ラッパーを介してリモート ホストから PHP ファイルを送信することはできません。ソースコードではなく、ブラウザに送信されるような解析済みの PHP ファイルです。そしてソースコードを取ります。HTTPincludeinclude

詳細については、次のマニュアル エントリを参照してinclude()ください。

警告。セキュリティ警告:

リモート ファイルはリモート サーバーで処理される場合があります (ファイル拡張子と、リモート サーバーが PHP を実行しているかどうかによって異なります) が、ローカル サーバーで処理されるため、有効な PHP スクリプトを生成する必要があります。リモートサーバーからのファイルをそこで処理して出力する必要がある場合は、 readfile() を使用する方がはるかに優れた関数です。それ以外の場合は、リモート スクリプトを保護して、有効で目的のコードを生成するように特別な注意を払う必要があります。

于 2012-08-06T14:09:24.040 に答える
4
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);
}

お届けします。また、たとえば、.php (処理されたプレーン テキスト) の代わりに .txt (プレーン テキスト) ファイルがあることを確認してください (空白の出力が得られるため)。

于 2012-08-06T14:13:45.233 に答える
2

Allow_url_include が有効になり、allow_url_fopen も有効になります。ブラウザーに standards.php の完全な URL を入力すると、ページの結果が表示されるので、アクセス権がないことは問題ではありませんよね?

allow_url_fopenphp.ini または httpd.confでallow_url_includeのみ設定できます。ファイルが含まれないようにしているのはローカル サーバーであり、ブラウザに URL を入力するのとは異なります。

リモートサーバーからインクルードするときに、グローバルであるはずの定数が「継承」されないのはなぜですか?

外部インクルードが機能したとしても、期待どおりに機能しません。HTTP 経由のインクルードは、標準のインクルードとは異なります。

インクルードされたファイルの出力を含めています。外部 PHP ファイルは、含まれる前に外部サーバーで処理されます。

この方法で外部の PHP ファイルを逐語的に読み取ることができれば、セキュリティ上の脆弱性が生じることは間違いありません。

于 2012-08-06T14:08:40.387 に答える
0

通常、外部インクルードを使用することはお勧めできません。

通常はうまく機能しません (またはまったく機能しません)。

したがって、外部インクルードは使用しないでください。

于 2012-08-06T14:04:54.587 に答える