2015-04-08 5 views
5

Ho una modifica fatta con lama di modificare una risorsa, come questo:laravel proteggere i campi nascosti del modulo e url

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

che genera un modulo con un'azione

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

E i miei campi, avendo testo e input nascosti

Vedendo questo URL, è molto facile per un utente con cattive intenzioni aggiornare altri post.

Come posso proteggere il percorso per fallire se l'ID viene manipolato con l'ispettore? Esiste un wat integrato per tokenizzare l'id per assicurarsi che corrisponda? Questo può anche essere applicato a tutti gli input nascosti?

Grazie

EDIT:

Un esempio sul mio nascosta utilizzo campi: miei post sono generalmente domande e le risposte, quando un utente tenta di aggiungere una risposta a una domanda, ho impostato question_id come nascosta campo, e voglio verificare che non sia manipolato.

+0

Intendi questo: http://laravel.com/docs/4.2/html#csrf-protection? –

+0

Invece di cercare di proteggere i tuoi URL, devi proteggere i tuoi dati tramite autenticazione e autorizzazione. Invece di fare affidamento sull'utente che non conosce l'URL giusto, è necessario verificare l'accesso e (se necessario) le autorizzazioni utente – lukasgeiter

+0

Io già faccio questo $ this-> abortIfLoggedUserCantEdit ($ post-> user-> id); Voglio solo una funzione più generica. – SkarXa

risposta

8

risposta di Limonte è corretta per garantire la possibilità di modificare i messaggi di altri popoli - e si dovrebbe sempre farlo. Per rispondere alla seconda metà della tua domanda:

Ho impostato question_id come campo nascosto e voglio controllare che non sia manipolato.

Il problema è che si può mai fiducia i dati forniti da un client per il sistema. È necessario sempre presumere che sia stato manomesso.

Una possibilità per contribuire a minimizzare il rischio è che si può utilizzare il encryption service by Laravel per fare questo:

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

Poi nel controller

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

solo assicurarsi di aver impostato un caso chiave di crittografia dell'applicazione nel file di configurazione app.php

+0

Aggiungerò un route_id crittografato a tutti i miei moduli e inserirò un filtro per controllarlo su ogni richiesta. – SkarXa

2

Per proteggere il percorso è necessario controllare l'autorizzazione in [email protected].

Nel controllo che inizia metodo se l'utente può modificare determinato posto:

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

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

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

Lo sto facendo, ma voglio un modo generico per farlo per tutti i miei percorsi di modifica, inoltre non posso proteggere i campi nascosti in questo modo – SkarXa

+0

Non so se c'è un modo per farlo per tutte le tue modifiche itinerari. È possibile utilizzare un filtro, ma si avranno altri percorsi in cui i parametri sono denominati in modo diverso e si lavorerà con relazioni diverse. Finiresti per avere 1 filtro per ogni controller. – user3158900

+0

È 'Auth :: id()' o 'Auth :: user() -> id'? – Laurence