Скрытые атрибуты Laravel. например Пароль - безопасность

Согласно http://laravel.com/docs/eloquent, можно скрыть атрибуты от преобразования массива или 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
                    )

person Gravy    schedule 26.09.2013    source источник


Ответы (3)


Когда вы запускаете User::all(), он возвращает объект Collection. Эта коллекция содержит всех ваших пользователей в объектной форме. Поэтому ваши пользователи будут содержать свои пароли. Это делается для того, чтобы вы могли отображать хешированный пароль по любой причине. Однако, как вы сказали ранее, если вы преобразуете коллекцию или пользователей в массивы или JSON, поле пароля должно исчезнуть, если оно скрыто.

Поэтому, если вы хотите избавиться от них, попробуйте запустить следующее:

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

dd() эти оба, чтобы осмотреть их. Поле пароля исчезнет.

Это объясняется в документации Laravel по сериализации.

person searsaw    schedule 26.09.2013

Нет, потому что вы НЕ должны делать что-то подобное в продакшене (или в реальном мире).

Ваши представления, написанные в Blade, могут получить результат User::all() и обработать его, но это PHP (сервер), а не HTML (клиент), и он преобразует эти данные в HTML, прежде чем они будут переданы клиенту.

Так это

print_r(User::all())

Это то, что вы никогда не сделаете, чтобы показать пользователю, это то, что мы используем для отладки, но на самом деле это ничего не значит.

Но если у вас есть другие примеры, когда конфиденциальные данные могут быть переданы через представление вашему клиенту, мы можем обсудить и это.

person Antonio Carlos Ribeiro    schedule 26.09.2013
comment
Хорошо... как насчет $user->password - person Gravy; 26.09.2013
comment
Это то, что вы можете использовать в своем коде или нет. Если вы считаете, что это конфиденциальные данные, никогда не записывайте их в представление. :) - person Antonio Carlos Ribeiro; 26.09.2013
comment
Я согласен. Но тогда почему вы можете автоматически защитить его через запрос json или массива, но не через объект? - person Gravy; 26.09.2013
comment
Потому что вы не должны отправлять объекты в представление. В шаблоне MVC представления должны получать данные, относящиеся к ним, обработанные данные, а не объекты, потому что им не нужно ничего знать о вашей бизнес-логике. - person Antonio Carlos Ribeiro; 26.09.2013
comment
Вы можете защитить его автоматически, чтобы при выполнении запроса AJAX вы могли вернуть строку JSON вашего объекта User, не беспокоясь об его удалении перед отправкой. - person searsaw; 27.09.2013

В laravel, если вы вернете любой объект модели в контроллер, который представляет любую сущность, он будет преобразован в JSON.
Это полезно для создания API, и скрытые поля очень помогают.

person palash140    schedule 03.07.2016