2015-04-08 15 views
5

Ich habe eine mit Klinge bearbeiten, eine Ressource zu bearbeiten, wie folgt aus:Laravel Form versteckte Felder schützen und URL

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

, die mit Wirkung eine Form erzeugt

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

Und meine Felder, mit Text und versteckte Eingaben

Mit dieser URL ist es für einen schlecht gemeinten Benutzer sehr einfach, andere Posts zu aktualisieren.

Wie kann ich die Route schützen, damit sie fehlschlägt, wenn die ID mit dem Inspector manipuliert wird? Gibt es ein eingebautes Wat, um die ID zu tokenisieren, um sicherzustellen, dass sie übereinstimmt? Kann dies auch für alle versteckten Eingänge gelten?

Dank

EDIT:

Ein Beispiel für meine versteckten Felder Nutzung: Meine Beiträge im allgemeinen Fragen und Antworten sind, wenn ein Benutzer eine Antwort auf eine Frage hinzuzufügen versucht, habe ich question_id als verstecktes Feld, und ich möchte überprüfen, dass es nicht manipuliert ist.

+0

Meinst du das: http://laravel.com/docs/4.2/html#csrf-protection? –

+0

Anstatt zu versuchen, Ihre URLs zu schützen, sollten Sie Ihre Daten durch Authentifizierung und Autorisierung schützen. Anstatt sich darauf zu verlassen, dass der Benutzer die richtige URL nicht kennt, sollten Sie nach einem Login und (falls erforderlich) Benutzerberechtigungen suchen. – lukasgeiter

+0

Ich mache das schon $ this-> abortIfLoggedUserCantEdit ($ post-> user-> id); Ich möchte nur eine allgemeinere Funktion. – SkarXa

Antwort

8

Limonte Antwort ist richtig, die Fähigkeit zur Sicherung anderer Völker Beiträge zu bearbeiten - und Sie sollten das immer tun. Um die zweite Hälfte Ihrer Frage zu beantworten:

Ich habe question_id als ein verstecktes Feld festgelegt, und ich möchte überprüfen, dass es nicht manipuliert ist.

Das Problem ist, dass man nie Vertrauen der von einem Client auf Ihr System gelieferten Daten. Sie müssen immer annehmen, dass es manipuliert worden ist.

Eine Möglichkeit zu helfen minimieren das Risiko Sie die encryption service by Laravel, dies zu tun verwenden können:

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

Dann in Ihrem Controller

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

So stellen Sie sicher, dass Sie eine zufällige festgelegt haben Anwendung Verschlüsselungsschlüssel in Ihrer app.php Konfigurationsdatei

+0

Ich füge allen meinen Formularen eine verschlüsselte route_id hinzu und setze einen Filter, um es bei jeder Anfrage zu überprüfen. – SkarXa

2

Um die Route zu schützen, sollten Sie die Erlaubnis in [email protected] überprüfen.

Bei dem Verfahren beginnen, zu überprüfen, ob Benutzer bearbeiten können Post gegeben:

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

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

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

Ich mache das, aber ich möchte eine generische Möglichkeit, dies für alle meine Bearbeitungsrouten zu tun, auch kann ich versteckte Felder auf diese Weise nicht schützen – SkarXa

+0

Ich weiß nicht, ob es eine Möglichkeit gibt, dies für alle Ihre Bearbeitung zu tun Routen. Sie könnten einen Filter verwenden, aber Sie haben andere Routen, auf denen die Parameter anders benannt sind und Sie mit unterschiedlichen Beziehungen arbeiten. Sie würden am Ende 1 Filter für jeden Controller haben. – user3158900

+0

Ist es 'Auth :: id()' oder 'Auth :: user() -> id'? – Laurence