1

PHPで、私的に宣言された変数を含むクラスを作成しました。

class testClass {
   private $_db_name = 'test_db';
   private $_db_user = 'test_user';
   private $_db_pass = 'test_pass';
}

偶然にも、クラスをインスタンス化した後、print_r設定した変数に対してを実行すると、これらのプライベート変数が画面に出力されました。

$test = new testClass();
print_r($test);

戻り値:

testClass Object
(
    [_db_name:testClass:private] => test_db
    [_db_user:testClass:private] => test_user
    [_db_pass:testClass:private] => test_pass
)

これは私にとっていくぶん心配です。他の人がパスワードなどにアクセスせずに含めて利用できるように、機密情報を含むクラスをサーバーにパッケージ化すると、それらを単純にダンプできます。この動作が発生しないようにするために、ここで重要な何かが欠けていますか?オブジェクト内の機密情報を処理するためのより良い方法はありますか?

4

2 に答える 2

1

メンバーを非公開に設定することは、あなたが見る方法でのセキュリティを意図したものではありません (つまり、機密データを非表示にするため)。これは単に、拡張クラスまたはアプリケーション全体でメンバーを使用する他の人 (開発者) に対するセキュリティです。

データを見ることができない人と共有されるのを防ぐためのものではありません。他の人に見られたくない場合は、他の人が利用しているコードに含めないでください。

簡単に言えば。可視性は、ジュニア開発者が物事を台無しにしたり、コードを台無しにしたりするのを防ぐためのものです. ;-)

于 2013-03-12T16:38:36.340 に答える
0

PHP コードにアクセスできる場合は、その中のすべてにアクセスできます。print_rそれらを変数として宣言せずに処理することで、関数に含まれないようにすることができますfinal public function __get($prop)

final public function __get($prop) {
  switch ($prop) {
    case "_db_name":
     return 'test_db';

  }

  return $this->$prop; //this also works on all private vars, so you might want some extra checking.
}

しかし、もう一度、あなたのパッケージをそのように追加できるとしたら、それを見るrequire('your/package/file.php')のを妨げているのは何echo implode('', file('your/package/file.php'));ですか?

于 2013-03-12T14:29:39.580 に答える