2013-09-26 1 views
12

В соответствии с http://laravel.com/docs/eloquent можно скрыть атрибуты из массива или преобразование JSON с помощью защищенной $ скрытой переменной в модели.Laravel скрытые атрибуты. например Пароль - безопасность

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

Великий, однако при запуске print_r(User::all()) зашифрованный пароль передается от сервера к клиенту внутри объекта пользователя.

Это ограничение не ограничивается только 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 
        ) 

ответ

20

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

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

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

dd() это как их инспектировать. Поле пароля исчезнет.

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

3

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

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

Так что

print_r(User::all()) 

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

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

+0

Хорошо ... как насчет '$ user-> password' – Gravy

+0

Это то, что вам нужно использовать в вашем коде или нет. Если вы считаете, что это конфиденциальные данные, никогда не записывайте их на просмотр. :) –

+0

Я согласен с тобой. Но почему тогда вы сможете защитить его автоматически с помощью запроса json или массива, но не через объект? – Gravy

0

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