ログインしたユーザーによってscriptA.phpが実行されると、system.shまたはexec()を使用して別のscriptB.phpが呼び出されます。システムコマンドによって実行されたスクリプトは、実行中のスクリプトのSESSIONデータにアクセスできますか?
scriptB.phpは、最初にscriptA.phpを実行するユーザーのSESSIONデータのパラメータを取得できますか? ありがとう!
ログインしたユーザーによってscriptA.phpが実行されると、system.shまたはexec()を使用して別のscriptB.phpが呼び出されます。システムコマンドによって実行されたスクリプトは、実行中のスクリプトのSESSIONデータにアクセスできますか?
scriptB.phpは、最初にscriptA.phpを実行するユーザーのSESSIONデータのパラメータを取得できますか? ありがとう!
いいえ、伝統的な方法($_SESSION
を使用)ではできません。最善の方法は、データを引数としてCLIコマンドに渡すか、またはSTDIN
に書き込むことです(また、scriptB.php
で読んでください)。
権限を持っている場合は、セッションファイルを読むこともできます(ファイル内のセッションを処理している場合)...しかしそれはお勧めできません。
私は、$ argv []配列がページがSYSTEM配列を所有していないために行く方法であると付け加えます。これは、システムコマンドとしてシステムによって検証された内部コマンドを作成し、 URLフィールド。別のレベルでのアクセスを防ぐため、scriptB.phpをウェブサイトのルートフォルダの外に置くこともお勧めします。 – Ted
はい、それは私がCLIコマンドに引数としてデータを渡すことによって意味されました。もちろん、危険な注射を防ぐために 'scriptB.php'を呼び出す際には、[escapeshellarg](http://us.php.net/manual/en/function.escapeshellarg.php)を使用してください。 –
あなたの質問がセキュリティ上の懸念事項の場合:
私はいいえと言います。 2番目のスクリプトは、最初のスクリプトの変数にアクセスできません。
しかし、サーバーが(非常に)間違って構成されていると、スクリプトBはPHPで使用される一時セッションディレクトリ(php.iniのsession.save_path)からシリアル化されたセッションデータにアクセスしようとします。
スクリプトAとスクリプトBの間でデータをやり取りする場合は、FIFO、標準入力などの他の方法を使用できます。なぜ別のスクリプトから1つのスクリプトを実行するのか理解できませんexec()を使用します。その後、
scriptBは完了するまでに時間がかかります。完全に実行しなければなりません。私がscriptBをウェブサイトのルートフォルダから外した場合、その脅威を乗り越えることはできますか? – Ted
これは一般的なルートフォルダの問題ではなく、PHP共有セッションフォルダ(debianの/ var/lib/php5 /)へのアクセスの問題です。通常の状況下では、これにアクセスするスクリプトは許可されません。 しかし、最初に別のPHPスクリプトを実行するためにexec()を使用しないでください。私は、これを実行するためにキューメカニズムを使用することをお勧めします。これはかなり簡単です。たとえば、必要なデータをscriptBのSQLテーブルに入れてから、このテーブルで新しいデータを探し、必要なものを達成するためのスクリプトを作成します。 – bohwaz
あなたは、標準のファイルベースのセッションを使用している場合、あなたは親スクリプトは、コマンドラインパラメータとして子スクリプトにセッションのIDを渡す可能性があり、例えば
shell_exec('php scriptB.php ' . session_id());
のようなもの、それを取得scriptB内ID:
session_id($argc[1]); // argc contains command line args.
session_start();
は、私は、コマンドラインスクリプトでセッションを開始しようとしたことがありませんので、あなたは、クッキーの誤差等に対処する必要があります。あなたは)(にsession_startを使用できない場合でも、しかし、あなたはいつもの線に沿って何かをすることwhich'd、直接セッションファイルにアクセスし、それをアンシリアライズすることができます。データベースのように、他のセッションシステムについては
$sess_path = session_save_path() . '/sess_' . $argc[1];
$serialized = file_get_contents($sess_file);
$_SESSION = unserialize($serialized);
、ファイルを使いこなすのではなく、データベースにアクセスします。
CLIの引数として渡すことはできますか? –