web-dev-qa-db-ja.com

Laravel非表示の属性。例:パスワード-セキュリティ

http://laravel.com/docs/eloquent によると、モデルの保護された$ hidden変数を使用して、配列またはJSON変換から属性を非表示にすることができます。

_class User extends Eloquent {
    protected $hidden = array('password');
}
_

すばらしいですが、print_r(User::all())を実行すると、暗号化されたパスワードがUserオブジェクト内のサーバーからクライアントに送信されます。

これは、print_r()だけに限定されているわけではなく、特定のユーザーが照会された場合、_$user->password_は暗号化されたパスワードをビューに表示します。

これを止める方法はありますか?ユーザーオブジェクトが照会されるたびに、パスワードは必要ありませんが、データの一部として送信されます。

_Illuminate\Database\Eloquent\Collection Object
(
[items:protected] => Array
    (
        [0] => User Object
            (
                [hidden:protected] => Array
                    (
                        [0] => password
                    )

                [connection:protected] => 
                [table:protected] => 
                [primaryKey:protected] => id
                [perPage:protected] => 15
                [incrementing] => 1
                [timestamps] => 1
                [attributes:protected] => Array
                    (
                        [id] => 1
                        [email] => [email protected]
                        [first_name] => Admin
                        [last_name] => User
                        [password] => $2y$10$7Wg2Wim9zHbtGQRAi0z6XeapJbAIoh4RhEnVXvdMtFnwcOh5g/W2a
                        [permissions] => 
                        [activated] => 1
                        [activation_code] => 
                        [activated_at] => 
                        [last_login] => 
                        [persist_code] => 
                        [reset_password_code] => 
                        [created_at] => 2013-09-26 10:24:23
                        [updated_at] => 2013-09-26 10:24:23
                    )
_
17
Gravy

User::all()を実行すると、Collectionオブジェクトが返されます。このコレクションには、すべてのユーザーがオブジェクト形式で含まれています。したがって、ユーザーにはパスワードが含まれます。これは、何らかの理由でハッシュされたパスワードを表示できるようにするためです。ただし、前に述べたように、コレクションまたはユーザーを配列またはJSONに変換する場合、パスワードフィールドは非表示にすると表示されなくなります。

したがって、それらを削除したい場合は、次のコマンドを実行してみてください。

_$array_of_users = Users::all()->toArray();
$json_of_users = Users::all()->toJson();
_

dd()これらの両方を検査します。パスワードフィールドはなくなります。

これはLaravelの serialization に関するドキュメントで説明されています。

31
searsaw

いいえ、そのようなことを本番環境(または実世界)で行うべきではありません。

ブレードで記述されたビューはUser::all()結果を受け取って処理できますが、これはHTML(クライアント)ではなくPHP(サーバー)であり、データを変換しますクライアントに渡される前にHTMLに変換されます。

したがって、この

print_r(User::all())

ユーザーに表示することは決してないものであり、デバッグに使用するものですが、実際には何も意味しません。

ただし、他の例がある場合、機密データがビューを介してクライアントに渡される可能性がある場合は、それについても議論できます。

laravelでは、任意のエンティティを表すコントローラー内の任意のモデルオブジェクトを返す場合、JSONに変換されます。
これはAPIの作成に役立ち、非表示フィールドがあると非常に役立ちます

0
palash140