2013-09-26 11 views
12

Zgodnie z http://laravel.com/docs/eloquent można ukryć atrybuty z macierzy lub konwertera JSON, używając ukrytej zmiennej ukrytej $ w Modelu.Ukryte atrybuty Laravel. na przykład Hasło - zabezpieczenie

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

Wielki, jednak po uruchomieniu print_r(User::all()) zaszyfrowane hasło jest wysyłane z serwera do klienta wewnątrz obiektu użytkownika.

Nie ogranicza się tylko do funkcji print_r(), jeśli konkretny użytkownik jest zapytany, w widoku zostanie wyświetlone zaszyfrowane hasło.

Czy istnieje sposób na zatrzymanie tego? Za każdym razem, gdy mój obiekt użytkownika jest sprawdzany, hasło zostanie wysłane wraz z nim jako część danych, nawet jeśli nie musi być.

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 
        ) 

Odpowiedz

20

Po uruchomieniu User::all() zwraca obiekt Collection. Ta kolekcja zawiera wszystkich użytkowników w formularzu obiektu. Dlatego Twoi użytkownicy będą zawierać swoje hasła. Dzięki temu możesz wyświetlić hashowane hasło bez względu na przyczynę. Jednak, jak już wcześniej powiedziałeś, jeśli przekształcisz kolekcję lub użytkowników w tablice lub JSON, pole hasła powinno zniknąć, jeśli jest ukryte.

Dlatego, jeśli chcesz się ich pozbyć, spróbuj uruchomić następujące:

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

dd() one zarówno do ich wglądu. Pole hasła zniknie.

Zostało to wyjaśnione w dokumentacji Laravel na temat serialization.

3

Nie, ponieważ NIE powinieneś robić czegoś takiego w produkcji (lub w realnym świecie).

Twoje poglądy, napisane w Blade, mogą otrzymać wynik User::all() i przetworzyć go, ale to PHP (serwer), a nie HTML (klient), i przekształci te dane w HTML przed przekazaniem do klienta.

Więc to

print_r(User::all()) 

jest coś, czego nigdy nie robić, aby pokazać użytkownikowi, że to coś, czego używać do debugowania, ale to naprawdę nic nie znaczy.

Ale jeśli masz jakieś inne przykłady, kiedy dane wrażliwe mogą być przekazywane za pośrednictwem widoku do klienta, możemy to również omówić.

+0

Ok ... o "$ user-> password' – Gravy

+0

To jest coś, co należy do ciebie w kodzie, czy nie. Jeśli uważasz, że jest to poufne dane, nigdy nie pisz tego w widoku. :) –

+0

Zgadzam się z tobą. Ale dlaczego miałbyś go chronić automatycznie poprzez żądanie json lub tablicę, ale nie przez obiekt? – Gravy

0

W laravel, jeśli zwrócisz dowolny obiekt modelu w kontrolerze, który reprezentuje dowolny obiekt, zostanie przekonwertowany na JSON.
Przydaje się do tworzenia API, a ukryte pola pomagają dużo