3

現在のファイルが「ルート」ファイル (apache によって要求された、または CLI 経由で実行された) であるかどうか、または含まれているファイルであるかどうかを判断する方法はありますか?

basename($_SERVER['SCRIPT_FILENAME']) != basename(__FILE__) 

動作しますが、パス全体ではなくファイル名に基づいてのみ動作するため、ハックです。これを行うための、より優れた、よりエレガントな方法があればいいのにと思います。


コンテキストのビット

私はScaffoldという名前の PHP 5.4+ API フレームワークを作成しています。これは、 API ファーストの方法論に非常に役立ちます。現在の問題は、API ファーストアプリケーションを作成する多くの人が、アプリケーション内のクラスを介して API を使用することです。

$user = Scaffold::get('/users/nathaniel');

これを行う良い方法は、後で Web 要求をサーバーに送信するのではなく、実際の API である場合です。そうすれば、HTTP プロトコルのオーバーヘッドを回避できます。

私はそれを行う方法についてかなり良い考えを持っていますが、問題は、応答をブラウザーに送信する必要があるかどうか (エンコードされたものとすべて) を知る必要があるか、Scaffold::request(またはそのエイリアスのいずれかScaffold::getがそれらの1つだけです。

私がこれを行うことにした方法は、アプリケーションのルート ファイル (通常は apache 経由で要求されるファイル) が実際に要求されたか、または別のファイルに含まれているかを確認することです。

4

3 に答える 3

1

含まれているかどうかを確認する一般的な方法は、スクリプト ファイルでエントリ ポイントとなる定数を定義し、含まれているファイルにその定数の存在を確認させることです。定義されていない場合、ファイルはインクルードされずに直接実行されました。

別の方法として、実行が遅くなる可能性がありますが、外部定数を定義する必要はありません。debug_backtrace()でコール スタックをチェックすることです。

于 2012-09-29T19:57:29.137 に答える
0

それを行う別の「ハッキーな」方法は、変数 say を設定$is_includedし、含まれているファイルで$is_includedが設定されているかどうかを確認することです。

以下に示します。

含むファイル (Any.php):

$is_included = true;
include('File.php');

ファイル.php:

if(!isset($is_included)){
    die('Direct Access not allowed.');
}
// And the code goes here..

私が間違っていなければ、codeigniter はこのようなものを使用して、cmd ライン アクセスを直接保護します。

于 2012-09-29T19:57:56.830 に答える
0

私は自分で動作するものを見つけました。これは PHP 5.4+ のみです (関数の後方参照のため)。

get_included_files()[0] === __FILE__
于 2012-09-29T20:02:33.970 に答える