2017-12-27 31 views
4

私はLaravelフォームのセキュリティを十分に理解しています。たとえば、フォームに <input type="hidden" name="user_id"> が含まれている場合、明らかに、ハッカーが更新を送信する前に値を変更する可能性があります。 私はCSRFでhereと見ていますが、十分な保護があるかどうかは十分にはわかりませんでしたか?Laravel 5 /フォームセキュリティ(明確化が必要)

など。上記を踏まえて、私がサイトに行ってフォームを開いて、私が閲覧することは許されているが変更はできず、悪意をもって "user_id"を変更すれば、フォームが{{ csrf_field() }}で保護されているか、 Crypt::encrypt($id)のようなセキュリティが、user_id(データベースに保持されています)とCrypt::decrypt($id)を隠していますか?

(すべてがhttpsで送信されても​​)クライアントブラウザで行id(ユーザーIDなど)を公開することは悪い習慣と考えられますか?

多くのおかげ

+0

csrfは、あなたが言及しているその特定のケースで本当に助けになりません。あなたがしたいのは、送信されているIDがあなたが予期しているものと同じかどうかをバックエンドでチェックすることです。 また、そのユーザー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トークンを使用するのに十分ではありません。また、ポリシー、ガード、ミドルウェアを使用してアプリを保護する必要があります。この場合

フォームからそれを読んで、その後使用するので、あなたは(この例では、from the docsある)データを保護するために、この1のようなポリシーを使用する必要がある場合、誰かがuser_idを変更することができます。

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

また、ユーザーIDを使用する必要がある場合は、オブジェクト全体が必要な場合は、常にauth()->id()またはauth()->user()を使用してください。フォームからユーザーIDを読み取らないでください。

+0

Alexeyに感謝します。私はミドルウェアを持っていますし、コントローラ内で変更を編集する人が管理者ロールを持ち、同じ会社に属していることを確認します(編集者と同じ会社IDを最初に持っていなければそれでもまだ十分ではありません)。 – KevinY

2

Laravelフレームワークは、このCSRFフィールドの値をセッション変数のように格納し、それを送信するときに一致させます。

フォームを送信すると、Laravelは保存されたセッション値からその値をチェックします。 が一致しない場合エラーがスローされます! :)

2

CSRFトークンはサイト間の要求からサイトを保護するため、外部ユーザーはフォームを複製して投稿要求を送信できません。 Laravelは、csrf_field()またはSession :: token()関数を使用して非表示フィールドに配置するランダムセッショントークンを作成します。 Laravelは、フォームを処理する前に、フォームから隠されたフィールド値を持つセッションをチェックします。

関連する問題