2017-12-27 1153 views
4

不完全有信心我已經理解了Laravel形式的安全性。例如,如果表單包含 <input type="hidden" name="user_id"> 那麼顯然黑客可以在提交更新之前更改該值。 雖然我在CSRF看了here,但我還沒有完全理解這是否足夠的保護?Laravel 5/Form安全(需要澄清)

E.g.考慮到上述情況,如果我訪問網站並打開表單以編輯記錄,我可以查看但不能更改,並惡意更改「user_id」,表單是否受{{ csrf_field() }}保護或我必須僱用一些進一步的安全性,如Crypt::encrypt($id)隱藏user_id(保存在數據庫中)和Crypt::decrypt($id)

在客戶端瀏覽器中顯示行標識(如用戶標識)是否被認爲是不良做法(即使所有內容都是通過https發送的)?

很多謝謝

+0

csrf並沒有真正幫助您提及的特定情況。你想要做的是檢查後端是否正在發送的ID是否與您所期望的相同。 您也可以對該用戶標識進行編碼,然後在後端對其進行解碼。 全部取決於你實際想要達到的目標嗎? – matiit

+0

在這裏,https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)閱讀了解csrf是什麼以及csrf令牌會爲你辯護。 – matiit

+0

如果'user_id'字段不會被用戶*和*在表單中看不到,爲什麼發送給客戶端?將'user_id'服務器端放在SESSION上,而不是客戶端上。 – ThoriumBR

回答

2

不,在這種情況下僅使用CSRF令牌是不夠的。您還需要使用策略,警衛和中間件來保護您的應用程序。

在這種情況下,一個人可以改變user_id如果從形式閱讀後使用,所以你需要使用策略這樣一個保護數據(本例中是from the docs):

public function update(User $user, Post $post) 
{ 
    return $user->id === $post->user_id; 
} 

此外,當您需要使用用戶ID時,如果需要整個對象,請始終使用auth()->id()auth()->user()。切勿從表單中讀取用戶ID。

+0

謝謝阿列克謝。我確實有一箇中間件,在控制器中我檢查編輯這個變更的人有一個管理員角色並且屬於同一個公司(他們也不會看到記錄,如果他們沒有與編輯人員相同的公司ID - 雖然還不夠)。 – KevinY

2

Laravel框架存儲此CSRF字段的值,如會話變量,並在您提交時與其匹配。

當您提交表單時,Laravel會檢查存儲的會話值中的值。如果有一個不匹配錯誤被拋出! :)

2

CSRF令牌保護網站免受跨站請求,意味着外部用戶不能複製表單併發送帖子請求。 Laravel使用csrf_field()或Session :: token()函數創建一個隨機會話令牌,我們將其放置在隱藏字段中。在處理表單之前,Laravel使用表單中的隱藏字段值來檢查會話。