2015-04-08 53 views
5

我有刀製作編輯編輯資源,如:Laravel保護形式的隱藏字段和URL

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

產生用行動

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

我的域的表單,有文字和隱藏的輸入

看到這個URL,對於一個壞心的用戶來說很容易更新其他帖子。

如何保護路線,使其失敗,如果該ID與督察操縱?有沒有內置的wat來標記id以確保它匹配?這也可以應用於所有隱藏的輸入嗎?

感謝

編輯:

的例子在我的隱藏字段用法: 我的帖子一般的問題和答案,當用戶試圖回答添加到一個問題,我設置question_id作爲隱藏字段,我想檢查它沒有被操縱。

+0

您的意思是這樣的:http://laravel.com/docs/4.2/html#csrf-protection? –

+0

您應該通過身份驗證和授權來保護您的數據,而不是試圖保護您的URL。而不是依靠用戶不知道正確的URL,你應該檢查登錄和(如果需要)用戶權限 – lukasgeiter

+0

我已經這樣做$ this-> abortIfLoggedUserCantEdit($ post-> user-> id);我只想要一個更通用的功能。 – SkarXa

回答

8

Limonte的答案是正確的,以確保編輯其他人的帖子的能力 - 你應該總是這樣做。回答您的問題的後半部分:

我將question_id設置爲隱藏字段,並且我想檢查它是否未被操縱。

問題是,你可以從來沒有信任由客戶端提供的數據到您的系統。你必須總是假設它已被篡改。

一個選項,以幫助減少風險,你可以使用encryption service by Laravel做到這一點:

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

然後在你的控制器

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

只要確保你已經設置一個隨機應用程序加密密鑰在您的app.php配置文件中

+0

我會爲我的所有表單添加一個加密的route_id,並在每個請求中放置一個篩選器以檢查它。 – SkarXa

2

爲了保護路線,您應該檢查[email protected]的權限。

在該方法開始檢查,如果用戶可以編輯特定職位:

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

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

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

我這樣做,但我想要一個通用的方式來做到這一點我所有的編輯路線,我也不能保護隱藏的領域 – SkarXa

+0

我不知道是否有辦法做到這一點所有的編輯路線。你可以使用一個過濾器,但是你會有其他的參數命名不同的路由,你會使用不同的關係。你最終會爲每個控制器設置一個過濾器。 – user3158900

+0

它是'Auth :: id()'還是'Auth :: user() - > id'? – Laurence