2015-04-08 14 views
5

mam zmienił wykonany z ostrzem edytować zasób, tak:laravel chronić formularza ukrytych pól i url

{{Form::model($post ,['action'=> ['[email protected]', 'id' => $post->id], 'method' => 'post'])}} 

który generuje formularz z działaniem

http://example.com/posts/edit/123 

i moich polach, mając tekst i ukryte dane wejściowe

Widząc ten adres URL, bardzo zła użytkownik może zaktualizować inne posty.

Jak mogę zabezpieczyć trasę, aby nie zadziałała, jeśli identyfikator zostanie zmanipulowany przez inspektora? Czy jest jakiś wbudowany wat, który tokenizuje identyfikator, aby upewnić się, że pasuje? Czy to też można zastosować do wszystkich ukrytych danych wejściowych?

Dzięki

EDIT:

Przykładem na moim ukrytym wykorzystanie pola: Moje posty są zwykle pytania i odpowiedzi, gdy użytkownik próbuje dodać odpowiedź na pytanie, ustawić question_id jako ukryty pole, i chcę to sprawdzić, nie jest manipulowane.

+0

Czy masz na myśli to: http://laravel.com/docs/4.2/html#csrf-protection? –

+0

Zamiast próbować chronić adresy URL, należy chronić dane przez uwierzytelnianie i autoryzację. Zamiast polegać na tym, że użytkownik nie zna właściwego adresu URL, powinieneś sprawdzić login i (jeśli to konieczne) uprawnienia użytkownika. – lukasgeiter

+0

Już to robię $ this-> abortIfLoggedUserCantEdit ($ post-> user-> id); Chcę tylko bardziej ogólnej funkcji. – SkarXa

Odpowiedz

8

odpowiedź Limonte jest prawidłowa, aby zabezpieczyć możliwość edycji posty innych ludzi - i zawsze należy zrobić. Aby odpowiedzieć na drugą połowę pytania:

Ustawiłem id_wiadomości jako ukryte pole, a ja chcę sprawdzić, czy nie jest manipulowane.

Problemem jest to, że można nigdy ufa danych dostarczonych przez klienta do systemu. Musisz zawsze założyć, że zostało zmienione.

Jedną z opcji, aby pomóc zminimalizować ryzyko jest można użyć encryption service by Laravel to zrobić:

{{ Form::hidden('question_id', Crypt::encrypt($question_id)) }} 

Następnie w kontrolerze

$question_id = Crypt::decrypt(Input::get('question_id')); 

Tylko upewnij się, że zestaw losowo klucz szyfrowania aplikacji w pliku konfiguracyjnym app.php

+0

Dodam zaszyfrowany parametr route_id do wszystkich moich formularzy i wstawię filtr, by sprawdził go przy każdym żądaniu. – SkarXa

2

Aby zabezpieczyć trasę, należy sprawdzić zezwolenie pod numerem [email protected].

w metodzie rozpoczynającego się sprawdzenie, czy dany użytkownik może edytować wpis:

public function update($postId) 
{ 
    $post = Post::findOrFail($postId); 

    if ($post->user_id !== Auth::id()) { 
     abort(403, 'Unauthorized action.'); 
    } 

    // validate, update record, etc. 
} 
+0

Robię to, ale chcę ogólny sposób, aby to zrobić dla wszystkich moich tras edycji, również nie mogę chronić ukrytych pól w ten sposób – SkarXa

+0

Nie wiem, czy jest sposób, aby to zrobić dla całej edycji trasy. Możesz użyć filtra, ale będziesz miał inne trasy, w których parametry będą się nazywać inaczej i będziesz pracować z różnymi relacjami. W efekcie otrzymasz 1 filtr dla każdego kontrolera. – user3158900

+0

Czy jest to 'Auth :: id()' lub 'Auth :: user() -> id'? – Laurence

Powiązane problemy