1

Sessionオブジェクトには、 DBオブジェクトを使用して SQL ステートメントを実行するいくつかのメソッドがあるため、Session オブジェクトに渡されるDBオブジェクトのインスタンスを取得しました。このDBオブジェクトをSessionオブジェクトのプロパティに格納する予定でした。

テストの結果、 Sessionオブジェクト プロパティに格納されているDBprint_rオブジェクトが公開されていることがわかりました。出力には、db ユーザー/パスワードが含まれていました。

したがって、 DBオブジェクトをプライベートな静的メンバーに格納して、 Sessionオブジェクトprint_rで が呼び出されるたびにこの情報が公開されないようにするというのが私の考えでした。

これは受け入れられますか、それとも静的メンバーの単なる不適切な使用ですか?

プライベートオブジェクトのプロパティが公開されないようにするための推奨される方法は何print_rですか?

これがコードサンプルです。

前:

class Session 
{

    public __construct(DB $db)
    {
        $this->db = $db;
    }

}

後:

class Session
{

    private static $db;

    pubic __construct(DB $db)
    {
        self::$db = $db;
    }

}
4

3 に答える 3

3

print_r/var_dump/var_export がこれらを読み取れないようにすることはできません。php チームには何度か報告されていますが、機能と見なされています (...) :

http://bugs.php.net/bug.php?id=39118&edit=2
http://bugs.php.net/bug.php?id=35822&edit=1

例のように静的メンバーを使用する場合は、すべての Session インスタンスがそれにアクセスできる/同じメンバーを持っていることに注意してください。これは後で驚きにつながる可能性があります。

もう 1 つのアイデアは、接続後に DB オブジェクトからログイン/パスを一掃することです。これは、問題を封じ込めるのに役立ちます。

于 2009-07-31T14:36:42.397 に答える
0

はい、これは悪いです

print_r()デバッグにのみ使用し、コンテンツをユーザーに表示するために使用しないでください。

テスターに​​見せてはならない秘密情報がクラスに含まれている場合は、秘密の部分をサニタイズ (フィールドを空の文字列などに設定) する必要があります。

于 2009-07-31T14:33:54.587 に答える
0

もう 1 つのアプローチは、DB オブジェクトの使用方法を変更することです。セッション メソッドで DB オブジェクトを使用する必要がある場合は、"global $db;" を呼び出す必要があります。メソッドの開始時に、機密性の高い DB ログイン情報が実際には永続データの $_SESSION オブジェクトの一部ではないことを確認します。適切な $db オブジェクトを定義し、その有効期間中に公開しないようにするのは、呼び出し元のページ次第です。スクリプトが SESSION オブジェクトにぶら下がっていることを気にせずに実行できます。

于 2009-07-31T14:49:03.813 に答える