0

一部のユーザーが自分のサーバーで自分のコードを記述/実行/テストできるようにするアプリケーションを作成しています。アプリケーションからプリロードされたコードを使用しています。これらのユーザーが自分のディレクトリでのみ作業できるようにしたいのですが、このタスクは で実行できますが、問題は、アプリケーションのコードを含めopen_basedir();たい場合、またはがまたは の内部にある場合、ファイルがが呼び出される前に含まれていません。requireincludefunctionclassopen_basedir

例 :

<?php

function test()
{
    require 'test.php';
}

test(); // ok

ini_set('open_basedir', 'users/username/');

test(); // permission denied

アプリケーションの「信頼できる」コードを含めることを許可するが、ユーザーのコードが別のディレクトリにアクセスすることを許可しないことは何とか可能ですか? 可能であれば、open_basedir() に関係なくても、これを解決する方法の例または主なアイデアを教えてください。

私の例では、許可を拒否したくありません。これにより、アプリケーションにいくつかの優れた機能を追加できるようになります。

もう一つの例 :

spl_autoload_register(function($class) {
    require $class . '.php';
});

ini_set('open_basedir', 'folder/');

new Test(); // Warning: require(): open_basedir restriction in effect.
4

1 に答える 1

0

他に解決策がない場合は、私自身の解決策を提示します。

これは最善の方法ではないと確信していますが、期待どおりに機能します。

まず第一に、カスタム コードを記述/実行するオプションを持つすべてのユーザーは、それをサーバーにアップロードするか、Web サイトに記述してから保存する必要があるため、保存する前にのみコードを確認する必要があります。 、サンドボックスを模倣したもの、アプリケーションの抽象化。次に、そのコードをサンドボックスで実行し (open_basedir の制限を変更して)、コードに致命的なエラーがない場合 (作業ディレクトリ内の別のファイルを変更していない場合 [変更された場合、これらのファイルもチェックされます])、次のようになります。保存しました。その後、ユーザーは実際のアプリケーションでコードを実行するオプションを利用できます。

短所:

  • アプリケーション全体の抽象化 (アプリケーションの構造が変更されるたびに)

長所:

  • サードパーティのコードが必要なファイル / 関数 / クラスのみにアクセスできるようにする
  • 未知のコードがアクセスすべきでない機能/メソッドをブロックする
  • 未知のコードを安全に実行
  • 実行ごとにコードをチェックする必要はありません
  • 外部ライブラリは必要ありません
于 2014-06-07T17:33:48.397 に答える