web-dev-qa-db-ja.com

phpを使用して別のサーバーからのphpファイルを含める

2つのPHPファイルが異なるサーバーにあり、1つはhttp://www.mysite.com/main.phpに、もう1つはhttp://www.sample.com/includeThis.phpにあります。

最初のファイルから2番目のファイルを含めたい。

2番目のファイルの内容は次のようになります。

<?php
$foo = "this is data from file one";

そして最初のファイル:

<?php
include "http://www.sample.com/includeThis.php";
echo $foo;

これを行う方法はありますか?

25
SolidSnake

いいえ、この設定はほとんどのウェブサーバー(php.ini)でデフォルトで無効/許可されていないため、includeを使用してのリモートアドレスからファイルを含めることはできませんセキュリティ上の理由

それでもリモートファイルのinclusionを許可する場合は、ディレクティブ allow_url_include はphp.iniでOnに設定する必要があります

しかし、これもまた、セキュリティ指向の観点では、悪い習慣です。そして、それで、それは一般的に無効にされています(実際に有効にされたのを見たことがありません)

リモートファイルの内容を読みたい場合file_get_contents代わりに関数[〜#〜] but [〜#〜]これは次のように返されます純粋なHTMLマークアップコード。server-sideコードはありません。

33
Sarfraz

あなたのコメントを読んだ後-あなたはコピープロテクションの手段としてこれをしたいと述べています-私の答えは強調されています忘れてください。これはコピー防止の仕組みではありません。

include()を使用して実行できる唯一のことは、ローカルインタープリターで解釈される他の場所からソースコードを取得することです。これは幼稚なほど簡単に解読できます。悪意のある顧客は、取得したコードをecho()するだけで済みます。

リモートサーバー(サーバー上)でリモートスクリプトを実行しても、スクリプトの状態(変数、関数...)は、呼び出すスクリプトに存在しないため、役に立ちません。から

次のオプションがあります。

  • スクリプトのコンパイル/エンコード/難読化、特定のPHPモジュールを実行する必要がある可能性があります(SOに関するこれに関する多くの質問))

  • サーバーで実行され、要求された操作を実行する実際のWebサービス(SOAPなどを使用)の作成

しかし、それだけの価値があるので、私は個人的には、エンコードされたスクリプトや、動作するために "電話をかける"必要のあるスクリプトを購入したり、クライアントに購入を勧めたりしません。私は、厳しいライセンス契約を通じて製品を保護することを信じています(企業の顧客があなたの製品を購入するのを怖がらせます。盗難に遭うリスクが高すぎるためです)。

3
Pekka

OPが自分自身のための解決策を見つけたのだろうか。私の知る限り、これを機能させる唯一の方法は、すべてのクライアントアカウントを、含めるスクリプトと同じサーバー上に置くことです-私は同様のことをしました:

/path_to_myserver_root/httpdocs/clients/client01/wwwroot/scriptA.php /path_to_myserver_root/httpdocs/clients/client02/wwwroot/scriptA.php ETC ....

次に:/path_to_myserver_root/privatefiles/myapp/scriptB.php

wwwrootは、各クライアントドメインが指す場所です。

scriptA.phpにはいくつかのビジネスロジックがあり、次にそのフルパスを持つ関数のscriptB.phpが含まれています。

require( '/ path_to_myserver_root/privatefiles/myapp/scriptB.php')

scriptB.phpはサーバー上のプライベート保護されたディレクトリにあり、httpからはアクセスできず、クライアントからはアクセスできません。

これを行う私の理由は、複数のアカウント間でバージョンの一貫性を維持するためであり、顧客からの独自の魔法のPHPコードを差し控えるためではありません。

ええ、YMMV。

2
antmeeks

あなたが提案したようにドメイン間を行き来しようとしているとき、実際にはそこにある準備ができているファイルを含めていません-プロセスは異なります。マシンはhttp経由でファイルを戻す必要がありますが、これはincludeステートメントの目的ではありません。

また、共有ホスティングを使用している場合、PHPは多くの場合、自分のドメインの外に出られないように設定されています。

この制限に該当しない場合、1つの解決策は、PHPを使用して他のサーバーからファイルのコピーをコピーし、ドメインに配置されたらそれを含めることです。 apporachは、変更を加えるたびに必要なすべての場所にそれをコピーする小さな「展開」スクリプトを書くことかもしれません...

お役に立てれば...

マーティン

0
Martin Milan

最初のファイルの名前を.txtに変更します
次に、よく考えます。クロスドメインインクルードが必要ですか?

0

使用する file_get_contents、ファイルを開くには、次のように2番目のファイルに追加します。

$secondFile = file_get_contents('http://www.sample.com/includeThis.php');
file_put_contents('your_file', $secondFile, FILE_APPEND);

これは、ファイルの最後に配置する場合に機能します。ファイルにインクルードするだけではありません。

とにかく、私が言ったように、これは危険で危険なIMOです。特に、その内部にあるコンテンツがわからない場合はそうです。

また、your_fileは、URLではなく実際のサーバーパスである必要があります。

0
SoLoGHoST